【问题标题】:WPF Close all child window except active child window and main windowWPF 关闭除活动子窗口和主窗口之外的所有子窗口
【发布时间】:2012-06-05 02:34:55
【问题描述】:

当我打开一个新的子窗体时,我有如下 C# WinForms 代码来关闭所有子窗体:

private void CloseAllActiveForms(Form[] MdiChildren)
{
    Form[] childArray = MdiChildren;
    foreach (Form childform in childArray)
    {
        childform.Close();
    }
}

如何在 WPF 窗口中使用?

我尝试了下面的代码,但它会关闭所有窗口,包括父窗口和活动窗口。

private void CloseAllWindows()
{
    for (int intCounter = App.Current.Windows.Count - 1; intCounter >= 0; intCounter--)
    {
        Application.Current.Windows[intCounter].Close();
    }
}

谢谢。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    据我所知,MDI 对 WPF 的支持是有限的,所以在创建伪子窗口时尝试使用 Tag 属性:

    Window child = new Window();
    child.Tag = "mdi_child";
    

    然后,在你的循环中,像这样修改它:

    foreach (Window win in App.Current.Windows)
    {
        if (!win.IsFocused && win.Tag.ToString() == "mdi_child")
        {
            win.Close();
        }
    }
    

    请注意,要使上述解决方案起作用,所有窗口都必须具有 Tag 属性,否则将在 win.Tag.ToString() 处引发异常。

    【讨论】:

    • 除了使用MDI还有其他选择吗?
    • MDI 风格的应用程序已经“过时”,这就是 WPF 放弃支持的原因之一。您的应用程序的目标是什么?
    • 基于 MDI 的应用程序最常见的替代方案是基于选项卡的界面。子窗口成为选项卡,所有选项卡都存在于同一个窗口中。抱歉,之前的评论很难回答你的问题。
    • 我有一个带有菜单的 wpf 应用程序...我需要单击菜单以在主窗口中显示另一个窗口...当我单击另一个菜单项时,前一个窗口是打开的应该在显示新窗口之前关闭。
    • 在这种情况下,您可能希望坚持使用 MDI。选项卡式界面没有多大意义。怎么做 MDI 的完整解释很长,但是这里有一个扩展 WPF 的好项目:wpfmdi.codeplex.com
    【解决方案2】:

    这是我在 WPF 中用来关闭程序所有子窗口的方法,此代码位于主 window.cs 文件中,但您可以修改 if(item!=this) 以检查特定窗口:

    foreach(Window item in App.Current.Windows)
    {
        if(item!=this)
            item.Close();
    }
    

    不要乱用子类或更多列表(尤其是因为代码已经有一个与之关联的窗口列表。)

    如果您想有选择地关闭窗口,那么您可以随时修改 if 语句以使用窗口类上的变量或检查预先存在的变量之一(例如父窗口的类) 在基础窗口类上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多