获取当前 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