2009-02-20 31 views
1

我前PHP開發人員現在做WPF/C#應用程序,和我無法理解訪問全局變量和用戶控件如何訪問主窗口的最佳方式等將全局信息存儲在WPF應用程序中的最佳位置在哪裏?

在我的窗口1 I類的構造函數將UserControls加載到內部字典中,然後在運行時動態地將它們加載到DockPanel中,這很好,並保持每個內部狀態。

public Window1() 
{ 
    InitializeComponent(); 

    List<string> userControlKeys = new List<string>(); 
    userControlKeys.Add("Welcome"); 
    userControlKeys.Add("News"); 
    Type type = this.GetType(); 
    Assembly assembly = type.Assembly; 
    foreach (string userControlKey in userControlKeys) 
    { 
     string userControlFullName = String.Format("{0}.Pages.{1}", type.Namespace, userControlKey); 
     UserControl userControl = (UserControl)assembly.CreateInstance(userControlFullName); 
     _userControls.Add(userControlKey, userControl); 
    } 

    //set the default page 
    btnWelcome.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
} 

問題:從用戶控件中如何訪問我的字典在窗口1?

  • 我可以訪問靜態類Window1但不是它的實例化,因此使它的Getter不會讓我更進一步。
  • 在C#中有全局屬性,但我可以想象有一個更好的,更多的OOP方式
  • 它看起來就像我在網站/會話變量方面看到的,因此缺少桌面的關鍵概念「國家無處不在」的發展

希望有人可以對此有所瞭解。

回答

2

嘗試使用singleton對象。這個想法是利用靜態對象的機制來實現「全局」變量,但它包含在一個用於理智管理的對象中。

0

我不知道它如何在WPF中工作,但在WinForms中,每個控件都有一個返回對其父窗體的引用的FindForm方法。我會想象在WPF中有類似的東西,儘管我仍然在尋找它。

+0

有對窗口類名爲GetWindow返回到父窗口的引用一個靜態方法: 窗口1 WND = Window.GetWindow(此)作爲Window1; – 2009-02-20 15:13:39

1

您有幾種選擇:

  1. 在.NET設置對象。這帶來了附加功能,如序列化。有意義的,如果這是一種應用程序設置,您的整個應用程序也應該訪問。
  2. 您可以存儲在Window1的資源集合下。然後使用UserControl中的FindResource(...)來查找該對象。這使得字典可以被Window1的子樹中的所有元素訪問。
  3. 您可以利用UserControl的標籤屬性。我不會推薦它。
0

一旦你真的進入WPF的數據綁定方面,控件應該(幾乎)不需要訪問代碼中的父代。數據綁定加轉換器功能非常強大。我將控件事件處理程序視爲絕對最後的手段。

我認爲你是對的; PHP是一個非常不同的世界。我一直在爲我的WPF和其他.Net應用程序使用MVVM模式。看看這篇文章關於MVVM模式,你可能會得到一些新的想法:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

相關問題