我以前是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中访问我的词典?
希望有人可以对此有所了解。
答案 0 :(得分:2)
尝试使用singleton对象。我们的想法是利用静态对象的机制来实现“全局”变量,但这些变量包含在一个用于理智管理的对象中。
答案 1 :(得分:1)
您有几个选择:
答案 2 :(得分:0)
我不知道它在WPF中是如何工作的,但是在WinForms中,每个控件都有一个FindForm方法,它返回对其父窗体的引用。我想在WPF中有类似的东西,虽然我还在寻找它。
答案 3 :(得分:0)
一旦你真正进入WPF的数据绑定方面,控件应该(几乎)永远不需要在代码中访问其父级。数据绑定加转换器非常强大。我将控制事件处理程序视为绝对的最后手段。
我认为你是对的; PHP是一个非常不同的世界。我一直在为我的WPF和其他.Net应用程序使用MVVM模式。看看这篇关于MVVM模式的文章,您可能会得到一些新的想法:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx