在WPF应用程序中存储全局信息的最佳位置在哪里?

时间:2009-02-20 14:47:34

标签: wpf

我以前是PHP开发人员,现在正在使用WPF / C#应用程序,并且无法理解访问全局变量的最佳方式以及UserControls如何访问主窗口等。

在我的Window1类的构造函数中,我将UserControls加载到内部Dictionary中,然后在运行时将它们动态加载到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));
}

问题:在UserControl中如何在Window1中访问我的词典?

  • 我可以访问静态类Window1但不能访问它的实例化,因此为它创建一个Getter让我无法进一步。
  • C#中有全局属性,但我可以想象有更好的,更多的OOP方式
  • 看起来好像我在网站/会话变量方面看这个,因此错过了“状态无处不在”的桌面开发的关键概念。

希望有人可以对此有所了解。

4 个答案:

答案 0 :(得分:2)

尝试使用singleton对象。我们的想法是利用静态对象的机制来实现“全局”变量,但这些变量包含在一个用于理智管理的对象中。

答案 1 :(得分:1)

您有几个选择:

  1. .Net设置对象。这带来了序列化等附加功能。如果这是某种应用程序设置,你的整个应用程序也应该具有访问权限,这是有道理的。
  2. 您可以存储在Window1的资源集合下。然后使用UserControl中的FindResource(...)来查找对象。这使得字典可以被Window1的子树中的所有元素访问。
  3. 您可以利用UserControl的Tag属性。我不推荐它。

答案 2 :(得分:0)

我不知道它在WPF中是如何工作的,但是在WinForms中,每个控件都有一个FindForm方法,它返回对其父窗体的引用。我想在WPF中有类似的东西,虽然我还在寻找它。

答案 3 :(得分:0)

一旦你真正进入WPF的数据绑定方面,控件应该(几乎)永远不需要在代码中访问其父级。数据绑定加转换器非常强大。我将控制事件处理程序视为绝对的最后手段。

我认为你是对的; PHP是一个非常不同的世界。我一直在为我的WPF和其他.Net应用程序使用MVVM模式。看看这篇关于MVVM模式的文章,您可能会得到一些新的想法:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx