如何让我的WPF MainWindow成为一个单身人士?

new*_*man 6 wpf singleton mainwindow

我想让我的MainWindow成为单身人士,因为我想让我的应用程序中的所有其他窗口更容易访问它.但我无法让它运行.这就是我做的.

像往常一样,我将MainWindow承包商public static MainWindow Instance设为私有,并创建了一个返回静态实例的属性.当我在没有任何其他更改的情况下运行它时,我得到"No Source Available"错误.我在网上搜索了一个相关的主题,网址是http://www.netframeworkdev.com/windows-presentation-foundation-wpf/xamlc-singleton-class-80578.shtml.但是,我不能像那里建议那样工作.有人建议在MainWindow.xaml中进行更改

<Window x:Class="TestApp.MainWindow"
Run Code Online (Sandbox Code Playgroud)

<Window x:Class="TestApp.MainWindow.Instance"
Run Code Online (Sandbox Code Playgroud)

这看似合乎逻辑.然而,当我这样做时,我得到了大量的编译错误(第一个说明命名空间TestApp已经包含'MainWindow'的定义.)

我在互联网上发现了很多关于如何制作单实例应用的文章.我不是在找这个.我只想让我的MainWindow成为单身人士.我已经多次在WinForm应用程序中完成了它.

mar*_*mnl 14

不确定是不是单身,但你为什么要这样做?你可以简单的使用Application.Current.MainWindow以随时随地获取Application.MainWindow财产在你的应用程序.请参见:http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow( v = VS.90).aspx.

Window mainWin = Application.Current.MainWindow;
mainWin.Title = "This will be set as the title of the Main Window";
Run Code Online (Sandbox Code Playgroud)

使它单身仍然对我没有意义 - 这如何使它更容易获得?您始终可以在公共静态变量中保存对主窗口的引用 - 这可以在主窗口的构造函数中设置:

public partial class MainWindow : Window
{
    public static MainWindow myMainWindow; // ASSUMPTION: only one MainWindow is ever constructed otherwise this will be overwritten by latest such instance

    public MainWindow()
    {
        InitializeComponent();            
        myMainWindow = this;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是后来给出了上面的Application.Current.MainWindow为什么要打扰..


Yog*_*esh 14

要创建MainWindow一个单例,这些是您需要做的步骤:添加MainWindow InstanceMainWindow类...

public static MainWindow Instance { get; private set; }
Run Code Online (Sandbox Code Playgroud)

注意:set accessor是私有的,因此没有其他人可以将其设置为其他任何东西.

添加一个静态构造函数MainWindow并生成构造函数MainWindow private,如下所示...

static MainWindow()
{
    Instance = new MainWindow();
}

private MainWindow()
{
    InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)

现在StartupUri="MainWindow.xaml"App.xaml文件中删除,以便在启动应用程序时不启动默认窗口.在App.xaml.cs中捕获App类的Startup事件,如下所示:

public App()
{
    ...
    Startup += App_Startup;
    ...
}

void App_Startup(object sender, StartupEventArgs e)
{
    TestApp.MainWindow.Instance.Show();
}
Run Code Online (Sandbox Code Playgroud)