我想让我的MainWindow成为单身人士,因为我想让我的应用程序中的所有其他窗口更容易访问它。但我无法让它运行。这就是我所做的。
像往常一样,我将MainWindow承包商设为私有,并创建了一个public static MainWindow Instance
属性来返回静态实例。当我在没有任何其他更改的情况下运行它时,我得到“No Source Available”错误。我用Google搜索了互联网,并在http://www.netframeworkdev.com/windows-presentation-foundation-wpf/xamlc-singleton-class-80578.shtml找到了一个相关主题。但是,我不能像那里建议那样工作。有人建议在
<Window x:Class="TestApp.MainWindow"
到
<Window x:Class="TestApp.MainWindow.Instance"
这看似合乎逻辑。但是,当我这样做时,我得到了大量的编译错误(首先说明命名空间TestApp已经包含'MainWindow'的定义。)
我在互联网上发现了很多关于如何制作单实例应用的文章。我不是在找这个。我只想让我的MainWindow成为单身人士。我已经多次在WinForm应用程序中完成了它。
答案 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();
}
}