C# 如何实例化窗口而不显示它?
我今天遇到了这个问题,在试图解决它的时候,我在WPF中发现了一些奇怪的东西 要查看问题,请创建新的WPF应用程序,添加按钮并单击事件:C# 如何实例化窗口而不显示它?,c#,wpf,C#,Wpf,我今天遇到了这个问题,在试图解决它的时候,我在WPF中发现了一些奇怪的东西 要查看问题,请创建新的WPF应用程序,添加按钮并单击事件: private void Button_Click(object sender, RoutedEventArgs e) { var window = new MainWindow(); } 启动应用程序并关闭它而不点击按钮将工作 启动应用程序,单击按钮并关闭它-将不起作用 应用程序将保留在内存中。几个月前我有过,但若我使用它的解决方案,那个么另一件奇怪
private void Button_Click(object sender, RoutedEventArgs e)
{
var window = new MainWindow();
}
启动应用程序并关闭它而不点击按钮将工作
启动应用程序,单击按钮并关闭它-将不起作用
应用程序将保留在内存中。几个月前我有过,但若我使用它的解决方案,那个么另一件奇怪的事情就会发生:当退出应用程序时,Window.Closed事件会为一个从未显示的窗口触发
问题:WPF在实例化窗口时做什么?为什么我不能像其他类一样简单地实例化它?我必须始终显示它吗?我相信你从错误的角度看这个问题。如果不打算显示窗口,则不需要以这种方式创建窗口
您面临的问题是,您在单击事件上创建的窗口从未被释放(这发生在您调用Close
时),因此UI循环将继续执行,应用程序将永远不会退出
关闭外部/可见窗口时,也可以通过调用Close
来避免这种情况
private Window window;
public MainWindow()
{
InitializeComponent();
}
public void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
window = new MainWindow();
}
protected override void OnClosed(EventArgs e)
{
if (window != null)
{
// Call Close on the window you created when the main main closes
window.Close();
}
base.OnClosed(e);
}
您需要使用私有字段,以便在调用OnClosed
事件时保留引用
我已经用一个简单的WPF应用程序对此进行了测试;但是,您不应在单击事件上实例化相同的窗口类型(即,MainWindow
)。我这样做是为了简单,但这完全没有必要。对不起,我误解了您想要实现的目标。你是在试图创建一个窗口,然后在关闭主/外窗口时自动销毁它吗?@rae1,有点像。我不关心窗口会发生什么,我只需要它的实例(它将加载xaml、init everything等),这样我就可以使用它了。但我一点也不想显示窗口。这很有效。现在我必须考虑如何使其适应我的应用程序,因为在那里仅为window的本地实例调用Close
,将关闭整个应用程序。我认为app.xaml
有一些特性。同样,您可能必须重新考虑您的体系结构,因为这是一种黑客行为,不应该在应用程序范围内实现。不管怎样,我都乐意帮忙我似乎不得不使用黑客
。我可以在这个老问题上再加一句,看看是否有人能提供更好的架构。是的,在离开活动之前关闭窗口会产生所有的魔力。唯一缺少的是App.xaml
中的ShutdownMode=“OnExplicitShutdown”
。