【问题标题】:How to instantiate a window without displaying it?如何实例化一个窗口而不显示它?
【发布时间】:2014-06-06 22:07:01
【问题描述】:

我今天遇到了问题,在尝试解决它时发现 WPF 中有一些奇怪的地方。

要查看问题,请创建新的 WPF 应用程序,添加按钮和单击事件:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var window = new MainWindow();
}

启动应用程序并在不单击按钮的情况下关闭它。

启动应用程序,单击按钮并关闭它 - 不起作用。

应用程序将留在内存中。几个月前我有similar issue,但如果我使用它的解决方案,就会发生另一件奇怪的事情:退出应用程序时,Window.Closed 事件被触发,因为一个从未显示的窗口。

问题:WPF 在实例化窗口时做了什么?为什么我不能像任何其他类一样简单地实例化它?我必须始终显示它吗?

【问题讨论】:

  • 对不起,我误解了您想要完成的任务。您是否尝试创建一个窗口,然后在关闭主/外部窗口时自动销毁它?
  • @rae1,有点像。我不在乎窗口会发生什么,我只需要它的实例(它将加载 xaml,初始化所有内容等),以便我可以使用它。但我根本不想显示窗口。

标签: c# wpf


【解决方案1】:

我相信您是从错误的角度看待这个问题的。如果您不打算显示它,则不需要以这种方式创建窗口。

您面临的问题是由于您在单击事件上创建的窗口从未被释放(当您调用 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)。我这样做是为了简单,但完全没有必要。

【讨论】:

  • 这行得通。现在我必须考虑如何使它适应我的multiple window solution,因为在那里调用Close 只是为了一个本地的窗口实例将关闭整个应用程序。我认为app.xaml 有一些属性。
  • 再一次,您可能需要重新考虑您的架构,因为这对于所有效果都是一种 hack,并且应该在应用程序范围内实现。不管怎样,乐于助人。 =)
  • 看来我必须使用hack。我可以为旧问题添加赏金,看看是否有人可以提供更好的架构。是的,在离开活动之前关闭窗口确实具有魔力。唯一缺少的是ShutdownMode="OnExplicitShutdown" in App.xaml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多