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

时间:2010-09-30 03:58:33

标签: wpf singleton mainwindow

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

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

中对MainWindow.xaml进行更改
<Window x:Class="TestApp.MainWindow"

<Window x:Class="TestApp.MainWindow.Instance"

这看似合乎逻辑。但是,当我这样做时,我得到了大量的编译错误(首先说明命名空间TestApp已经包含'MainWindow'的定义。)

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

4 个答案:

答案 0 :(得分:13)

不确定是否单身,但你为什么要这样做?您可以随时随地从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";

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

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;
    }
}

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

答案 1 :(得分:13)

要使MainWindow成为单身人士,您需要执行以下步骤: 将MainWindow Instance添加到MainWindow类...

public static MainWindow Instance { get; private set; }

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

MainWindow中添加静态构造函数并创建MainWindow private的构造函数,就像这样......

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

private MainWindow()
{
    InitializeComponent();
}

现在从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();
}

答案 2 :(得分:4)

App.xaml 文件中删除StartupUri="MainWindow.xaml"。 WPF将不再为您启动任何窗口。

<Application x:Class="WpfApplication1.App"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>

App.xaml.cs 中为Startup课程的App事件添加处理程序。
在此处理程序中,调用单例实例的Show()方法。

using System;
using System.Windows;

namespace WpfApplication1
{
    public partial class App : Application
    {
        public App()
        {
            Startup += new StartupEventHandler(App_Startup);
        }

        void App_Startup(object sender, StartupEventArgs e)
        {
            WpfApplication1.MainWindow.Instance.Show();
        }
    }
}

注意: App类有一个名为MainWindow的属性,因此在App_Startup()中我为MainWindow类添加了命名空间!< / p>

答案 3 :(得分:0)

非常感谢快速回答者。关键是我必须从App.xaml中删除StartupUri="MainWindow.xaml"。还要感谢静态构造器的尖端。我想提到的另一点是我们也可以覆盖OnStartup以启动主窗口(只是为了缩短几行):

 public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            TestApp.MainWindow.Instance.Show();
        }
    }