【问题标题】:How to close parent windows using WPF User Control如何使用 WPF 用户控件关闭父窗口
【发布时间】:2015-12-28 05:07:49
【问题描述】:

假设我有两个 WPF 窗口:window_One 和 window_Two。

  • window_One 有一个按钮。单击此按钮将打开 window_Two。
  • window_Two 包含一个用户控件。
    • 此用户控件有一个用于关闭 window_Two 的按钮。

我怎样才能实现这个场景?

【问题讨论】:

    标签: c# wpf user-controls wpf-controls


    【解决方案1】:

    在您创建的自定义控件中。您可以从按钮事件单击中访问父窗口。

    使用可视化树:

    var myWindow = (Window)VisualParent.GetSelfAndAncestors().FirstOrDefault(a => a is Window);
    myWindow.Close();
    

    或者简单地说:

    var myWindow = Window.GetWindow(this);
    myWindow.Close();
    

    当然,另一种选择是创建一个显示“MyButtonClicked”的自定义事件,然后让承载 UserControl 的窗口监听此事件,并在触发事件时关闭当前窗口。

    干杯!

    【讨论】:

      【解决方案2】:

      我们实现此功能是为了在 Window2 打开时关闭 Window1,但如果您将这些代码部分放在相应的区域中,它应该可以在任何情况下从任何地方关闭任何窗口:

      创建一个存储Window 对象的类,以及一个将关闭它的函数:

      CloseWindow.cs

      public static class CloseWindow
      {
          public static Window WinObject;
      
          public static void CloseParent()
          {
              try
              {
                  ((Window)WinObject).Close();
              }
              catch (Exception e)
              {
                  string value = e.Message.ToString(); // do whatever with this
              }
          }
      }
      

      在父窗口(您要关闭的窗口 - Window2,在这种情况下?)中,在其 onload 事件中,将其 Window 对象设置为等于 CloseWindow.WinObject

      CloseWindow.WinObject = (Window)this;
      

      然后,在孩子的 onload 事件中(或者,在 OP 的情况下,在 Window2 的用户控件的按钮事件中),让它执行 CloseParent() 函数:

      if (CloseWindow.WinObject != null)
          CloseWindow.CloseParent();
      

      【讨论】:

      • 这是您所写的各种场景的绝佳解决方案:it should work in any scenario to close any window from anywhere if you place these code parts in their appropriate areas。我不能比你足够在这里分享你的建议。我尝试了很多建议,包括这篇文章接受的答案。但它们都不起作用。我有一个 MS Office VSTO 加载项,其中有两个 WPF 用户控件。两者都是窗口(父 p)及其子 c。我能够使用您的代码从 c 关闭 p 。早些时候,我整天都在努力让它工作,但没有成功。非常感谢youSO
      【解决方案3】:

      您可以尝试使用 EventAggregator 在不同的 ViewModel 中实现此事件驱动逻辑。

      http://www.codeproject.com/Articles/355473/Prism-EventAggregator-Sample

      【讨论】:

      • 这是怎么关窗的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多