6

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

像往常一样,我将 MainWindow 承包商设为私有,并创建了一个public static MainWindow Instance属性来返回一个静态实例。当我在没有任何其他更改的情况下运行它时,出现“无可用源”错误。我在互联网上搜索并在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

4 回答 4

17

不确定是否要使其成为单例,但您为什么要这样做?您可以简单地使用 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 为什么要打扰..

于 2010-09-30T04:08:46.683 回答
15

要制作MainWindow单例,您需要执行以下步骤:将一个添加MainWindow InstanceMainWindow类...

public static MainWindow Instance { get; private set; }

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

在中添加一个静态构造函数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();
}
于 2010-09-30T07:02:56.523 回答
4

StartupUri="MainWindow.xaml"App.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加上了命名空间!

于 2010-09-30T06:12:14.863 回答
0

非常感谢大家的快速回答。关键是我必须StartupUri="MainWindow.xaml"从 App.xaml 中删除。也感谢静态构造器的提示。还有一点我想说的是,我们也可以重写 OnStartup 来启动主窗口(只是为了缩短几行):

 public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            TestApp.MainWindow.Instance.Show();
        }
    }
于 2010-09-30T13:56:07.390 回答