获取当前 MainWindow 实例的 WPF 最佳实践?
WPF best practice to get current MainWindow instance?
我收到警告说这可能是一个主观问题,可能会被关闭,但我还是要问。
我基本上是在尝试从从 MainWindow 中加载的 UserControl 访问 WPF 应用程序中的 MainWindow 上的按钮。
我目前正在从 UserControl 后面的代码中这样访问它:
((MainWindow)Application.Current.MainWindow).btnNext
但它看起来确实很乱,而且根据我的阅读,这并不是最佳做法。任何人都能够提供构成从 MainWindow 的当前实例访问控件/属性的最佳实践的答案 - 或与此相关的任何其他活动 windows/视图?
您可以使用 Window.GetWindow 方法获取对 UserControl 的父级 window 的引用。加载 UserControl 后调用此方法:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
this.Loaded += (s, e) =>
{
MainWindow parentWindow = Window.GetWindow(this) as MainWindow;
if (parentWindow != null)
{
//...
}
};
}
}
您还可以使用 Application.Current.Windows 属性:
访问所有打开的 windows
MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
使用哪一个取决于您的要求。如果您出于某种原因想要引用应用程序的主要 window,您可以坚持使用当前的方法。如果要引用 UserControl 的父 window,使用 Window.GetWindow 方法会更好。
最佳做法通常是使用 MVVM 设计模式并将 UI 控件绑定到可由多个视图共享的视图模型的源属性。但那是另一回事了。您可以参考以下link了解更多关于MVVM模式的信息:https://msdn.microsoft.com/en-us/library/hh848246.aspx
我收到警告说这可能是一个主观问题,可能会被关闭,但我还是要问。
我基本上是在尝试从从 MainWindow 中加载的 UserControl 访问 WPF 应用程序中的 MainWindow 上的按钮。
我目前正在从 UserControl 后面的代码中这样访问它:
((MainWindow)Application.Current.MainWindow).btnNext
但它看起来确实很乱,而且根据我的阅读,这并不是最佳做法。任何人都能够提供构成从 MainWindow 的当前实例访问控件/属性的最佳实践的答案 - 或与此相关的任何其他活动 windows/视图?
您可以使用 Window.GetWindow 方法获取对 UserControl 的父级 window 的引用。加载 UserControl 后调用此方法:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
this.Loaded += (s, e) =>
{
MainWindow parentWindow = Window.GetWindow(this) as MainWindow;
if (parentWindow != null)
{
//...
}
};
}
}
您还可以使用 Application.Current.Windows 属性:
访问所有打开的 windowsMainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
使用哪一个取决于您的要求。如果您出于某种原因想要引用应用程序的主要 window,您可以坚持使用当前的方法。如果要引用 UserControl 的父 window,使用 Window.GetWindow 方法会更好。
最佳做法通常是使用 MVVM 设计模式并将 UI 控件绑定到可由多个视图共享的视图模型的源属性。但那是另一回事了。您可以参考以下link了解更多关于MVVM模式的信息:https://msdn.microsoft.com/en-us/library/hh848246.aspx