2015-12-23 88 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