2015-12-23 91 views
0

我想分享至少两个WPF窗口之间下面的类之间的类:共享两个WPF窗口

namespace WPF 
{ 
    class dd_internals 
    { 
     public int current_process_index; 

     public class process_class 
     { 
      public string process_name; 
      public List<string> parm_list; 
      public List<string> var_list; 
      public List<string> statements; 
     } 

     public List<process_class> process_list = new List<process_class>(); 
    } 
} 

我将如何共享多个窗口之间这个类的一个实例?

确定代码显示dd_internals被传入构造函数window1,但不能直接在window1的成员函数中使用。

namespace posting2 
{ 
    public partial class Window1 : Window 
    { 
     public void Member() 
     { 
      int y = Data.current_process_index; 
      // Error: the name 'Data' does not exist in the current context 
     } 

     public Window1(dd_internals data) 
     { 
      int x = data.current_process_index; 
      // ok, it works here. 

      InitializeComponent(); 
     } 
    } 
} 
+0

没有足够的信息来真正告诉,但可能https://en.wikipedia.org/wiki/Singleton_pattern? –

+0

请解释“共享一个实例”的含义。一个你认为能做什么好的例子会有帮助。 –

+0

共享一个实例:这意味着有一个类x,两个窗口都会更新它,并且更新显示在它访问的任何位置。在C++中,一个模块可能定义类x,而其他所有模块都可以访问类ref *,其中ref =&x。 – quincy451

回答

3

有几个选项,例如:

  1. 正如我可以猜到一个窗口打开另一个窗口,所以你可以打开它之前传递这个对象的实例到第二个窗口。
  2. 您可以将其存储在Application.Properties

    Application.Current.Properties [ “钥匙”] = myObject的;

  3. 更大的应用程序的最佳选择是使用一些依赖容器(也有它的许多实现)和存储共享对象在这样的容器中

  4. 我真的不喜欢Singleton模式,因为它不是实际上是一种模式,但你也可以使用它。
+0

强制只有1个实例可用,创建和使用只有1个实例是有区别的。在后一种情况下,您的方法可行,但如果必须在应用程序生命周期中只创建一个实例,那么单例就是要走的路。该实例可以作为参数传递或分配给应用程序资源。 –

0

我想你需要使类的任意位置共享它之前公开或内部。

+0

只有当您希望该类对其他*程序集*可见时才有必要。 –

+0

同意。如果在同一个集会上,那么它至少应该是“内部”的。如图所示,dd_internals类默认为'private'。 – NER1808

1
var dd = new dd_internals(); 
var window1 = new YourWindow(dd); 
var window2 = new YourWindow(dd); 

dd所做的任何更改都将在所有窗口实例中可用。如果您需要处理诸如多线程之类的东西,或者在更改某些内容时调用某些内容,则需要将其添加到您的问题中。

你的编辑在语法上是无效的; C#区分大小写,因此Datadata是两个不同的标识符,其中一个标识符未被声明。我猜你想要的东西是这样的:

public partial class Window1 : Window 
{ 
    private readonly dd_internals myDd; 

    public void Member() 
    { 
     int y = myDd.current_process_index; 
    } 

    public Window1(dd_internals data) 
    { 
     InitializeComponent(); 
     myDd = data; 
    } 
} 

在你的真实项目中,请使用比“data”,“Window1”等更好的名字。这些名字并不意味着什么。在一个简短的例子中,他们很有用,但他们很快就让一个真正的程序变得难以理解。

+0

我在这里dd的问题只能在window1构造函数中看到......为了让window1的任何成员函数都可用,您需要local_dd = dd之类的东西,并在window1中设置local_dd。我可以做的...但在Windows1退出你必须复制它dd = local_dd ...似乎凌乱。 – quincy451

+0

您必须在窗口构造函数之外创建'dd'并将其传入。您不需要复制任何内容。请[编辑](http://stackoverflow.com/posts/34440333/edit)您的帖子来显示您的代码,因为我不明白什么是困难。 –

+0

添加代码以显示问题。 – quincy451

0

可以使类单

public class dd_internals 
    { 
     private static dd_internals instance; 
     public static dd_internals singleInstance; 

     private dd_internals() { } 

     public static dd_internals Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = new dd_internals(); 
       } 
       return instance; 
      } 
     } 

     public int current_process_index; 
     public class process_class 
     { 
      public string process_name; 
      public List<string> parm_list; 
      public List<string> var_list; 
      public List<string> statements; 
     } 
     public List<process_class> process_list = new List<process_class>(); 
    } 
+0

不是线程安全的方式来实现单身人士。 –

+0

得到这个工作。 – quincy451