获取当前MainWindow实例的WPF最佳实践?

gan*_*eii 2 wpf instance

我得到一个警告,这可能是一个主观问题,可能会被关闭,但无论如何我都会问.

我基本上试图从一个从MainWindow中加载的UserControl访问WPF应用程序中的MainWindow上的按钮.

我正在从UserControl的代码后面这样访问它:

((MainWindow)Application.Current.MainWindow).btnNext
Run Code Online (Sandbox Code Playgroud)

但它确实看起来很混乱,从我读过的内容来看,它并不是最佳实践.任何人都能够提供一个答案,构成从MainWindow的当前实例访问控件/属性的最佳实践 - 或者任何其他活动的窗口/视图?

mm8*_*mm8 7

您可以使用Window.GetWindow方法获取对UserControl的父窗口的引用.加载UserControl后调用此方法:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
        this.Loaded += (s, e) =>
        {
            MainWindow parentWindow = Window.GetWindow(this) as MainWindow;
            if (parentWindow != null)
            {
                //...
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用Application.Current.Windows属性访问所有打开的窗口:

MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

使用哪一个取决于您的要求.如果由于某种原因需要引用应用程序的主窗口,可以坚持使用当前的方法.如果您想要引用UserControl的父窗口,那么使用Window.GetWindow方法会更好.

最佳实践通常是使用MVVM设计模式并将UI控件绑定到可由多个视图共享的视图模型的源属性.但这是另一个故事.有关MVVM模式的更多信息,请参阅以下链接:https://msdn.microsoft.com/en-us/library/hh848246.aspx

  • 如果您经常访问主窗口,我会考虑将其设置为静态引用。即:使用单例或类似的东西。 (2认同)