【问题标题】:How to close the home window如何关闭主窗口
【发布时间】:2015-05-21 17:02:40
【问题描述】:

我正在用 c# 创建一个 wpf 应用程序,我知道要关闭/打开一个窗口,您必须使用 .Close() 和 .Show() 方法,但由于某种原因,主屏幕是第一个出现的窗口我启动应用程序,不会关闭。

        Home window1 = new Home();
        window1.Close();
        Name window2 = new Name();
        window2.Show();

Window2 出现,但 window1 不会关闭。有什么问题。

【问题讨论】:

    标签: c# wpf window


    【解决方案1】:

    显示window1 的代码在哪里?如果您在代码中的其他位置显示主窗口,则需要使用该引用来关闭它。创建一个新的Home 对象并调用其Close 方法不会关闭使用另一个Home 对象显示的窗口。

    【讨论】:

    • 我注意到调用close方法时,并没有关闭前一个窗口。例如,如果我打开了 window1,然后打开了 window2,我无法关闭 window1,但我可以关闭 window2。然后当我打开window2并打开window3时,我无法关闭window1或window2,但我可以关闭window3。它继续,只有最新的窗口可以关闭,之前的任何东西都不能。如何关闭以前的窗口。
    • 在哪里存储对窗口对象的引用?
    【解决方案2】:

    大概是因为如果您关闭窗口,您将关闭应用程序。

    如果您只想隐藏主窗口,请使用window.Hide() 方法。

    这来自Window.Close的帮助:

    可以使用以下方法之一关闭窗口 几个,众所周知的,系统提供的 位于其标题栏中的机制, 包括:

    ALT+F4。

    系统菜单 | 关闭

    关闭按钮。

    一个窗口也可以使用一个来关闭 几种众所周知的机制 在客户区内 由开发者提供,包括:

    文件 | 退出主窗口。

    文件 | 关闭关闭按钮 子窗口。

    更新

    Tormod Fjeldskår 的回答很有道理。我假设代码是作为示例给出的,而不是实际使用的代码。

    【讨论】:

      【解决方案3】:

      这是 WPF 中的一个错误。如果 SourceInitialized 事件尚未发生,Window.Close 将静默失败。对 Window.Close 的后续调用也将失败。

      https://connect.microsoft.com/WPF/feedback/ViewFeedback.aspx?FeedbackID=299100

      要解决此问题,请将其添加到您的窗口中:

      protected override void OnSourceInitialized(EventArgs e)
      {
          base.OnSourceInitialized(e);
      
          // check if we've already been closed
          if (m_bClosed)
          {
              // close the window now
              Close();
          }
      }
      
      protected override void OnClosing(CancelEventArgs e)
      {
          base.OnClosing(e);
      
          // make sure close wasn't cancelled
          if (!e.Cancel)
          {
              // mark window as closed
              m_bClosed = true;
      
              // if our source isn't initialized yet, Close won't actually work,
              // so we cancel this close and rely on SourceInitialized to close
              // the window
              if (new WindowInteropHelper(this).Handle == IntPtr.Zero)
                  e.Cancel = true;
          }
      }
      
      bool m_bClosed;
      

      【讨论】:

        【解决方案4】:

        或者您可以将 Window2 设为主窗口(您可以在 app.xaml 的 StartUpUri 属性中更改此设置)并且让 Window2 显示并关闭 Window1 或根本不显示 Window1。

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

        【讨论】:

          猜你喜欢
          • 2023-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多