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

时间:2016-12-26 15:06:20

标签: wpf instance

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

我基本上试图通过从MainWindow中加载的UserControl来访问WPF应用程序中的MainWindow上的按钮。

我目前正在从UserControl的代码背后访问它:

((MainWindow)Application.Current.MainWindow).btnNext

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

1 个答案:

答案 0 :(得分: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)
            {
                //...
            }
        };
    }
}

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

MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();

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

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