【问题标题】:How to bring MainWindow into view when closing a window?关闭窗口时如何使 MainWindow 进入视图?
【发布时间】:2015-08-11 21:21:02
【问题描述】:

当我关闭同一个应用程序中的特定窗口时,我试图让我的 MainWindow 出现。我试图这样做,但使用我创建的代码,它只是创建了一个新的 MainWindow 实例,我最终得到了 2 个 MainWindows 而不是所需的一个。这是我得到的下面的代码。

 private void Weight_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
            WeightCalculation.Show();
            this.WindowState = WindowState.Minimized;
        }

// 上面的代码可以正常工作,并最小化主窗口并显示选定的窗口。

private void Quit_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
        MainWindow bringIntoView = new MainWindow();
        bringIntoView.Show();
    }

// 现在上面这段代码就是问题代码。这段代码在新窗口中,我想要实现的是,当这个窗口关闭时,主窗口将被带回范围,而不是创建它的新实例,并给我留下 2 个主窗口而不是所需的 1 个主窗口。任何帮助都会很棒。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    使用Owner 属性来存储对主窗口的引用,然后您可以使用该属性来恢复窗口。

    private void Weight_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
            WeightCalculation.Owner = this;
            WeightCalculation.Show();
            this.WindowState = WindowState.Minimized;
        }
    

    其他地方

    private void Quit_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
        Owner.WindowState = WindowState.Normal;
    }
    

    但是,根据您所展示的行为,您可能希望考虑使用 ShowDialog() 而不是最小化父窗口并改用它。

    private void Weight_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
            WeightCalculation.Owner = this;
            WeightCalculation.ShowDialog(); //The code pauses here till the dialog is closed.
        }
    

    【讨论】:

    • 是的,工作得很好最终使用了这段代码,尽管你的代码给了我这个想法lol this.Close(); Application.Current.MainWindow.WindowState = WindowState.Normal;谢谢大家
    【解决方案2】:
    Application.Current.MainWindow.Activate();
    

    【讨论】:

      【解决方案3】:

      有一个方便的属性Application.Current.MainWindow 可以用来访问在 App.xaml 中声明的主窗口,你应该可以通过调用来显示它:

      Application.Current.MainWindow.Show();
      Application.Current.MainWindow.Activate();
      

      为了简化事情,您可以在 MainWindow 上创建一个静态方法来处理所有这些:

      public static void TryReveal()
      {
          var mainWindow = Application.Current.MainWindow;
      
          if (mainWindow == null)
          {
              // The main window has probably been closed.
              // This will stop .Show() and .Activate()
              // from throwing an exception if the window is closed.
              return;
          }
      
          if (mainWindow.WindowState == WindowState.Minimized)
          {
              mainWindow.WindowState = WindowState.Normal;
          }
      
          // Reveals if hidden
          mainWindow.Show();
      
          // Brings to foreground
          mainWindow.Activate();
      }
      

      然后您的其他窗口可以调用MainWindow.TryReveal()。这样你的窗口就不需要任何对主窗口的引用,因为静态方法会处理它。


      不过,您可以在 WPF 中处理此问题的最佳方式是(我认为)使用消息传递实现(例如 MVVM Light 的消息传递系统或 Caliburn.Micro 的 EventAggregator)。您的 MainWindow 将订阅“MainWindowViewStateMessage”或类似的东西(由您定义),而您的其他窗口将通过消息传递系统传递它。主窗口会拦截它并做必要的工作。

      【讨论】:

      • 这会抛出异常,因为窗口已经加载完毕
      • @GlenThomas 在我的测试中,这工作正常并且不会引发异常。
      • 啊,是的,如果窗口已经关闭,它只会抛出异常,但在问题中它只是被最小化了
      【解决方案4】:
      private void Quit_Click(object sender, RoutedEventArgs e)
          {
              this.Close();
              MainWindow bringIntoView = new MainWindow();
              bringIntoView.Show();
          }
      

      您正在创建 MainWindow 的一个新实例,然后显示它。这就是显示新 MainForm 的原因。

      您可以做的一件事是在 WeightCalculation 窗口中设置一个属性,如下所示:

      public MainWindow _mainWindow { get; set; }
      

      在显示 WeightCaculation 之前,将 _mainWindow 设置为您当前的 MainWindow 实例:

      MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
      WeightCalculation._mainWindow = this;
      WeightCalculation.Show();
      this.WindowState = WindowState.Minimized;
      

      您现在可以通过新表单与 MainWindow 进行交互。

      【讨论】:

      • Window 已经有一个非常好的属性来存储这种信息Owner,你不需要为它创建一个新的属性。
      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2014-03-17
      • 2023-01-24
      • 1970-01-01
      • 2021-05-09
      相关资源
      最近更新 更多