WPF 关闭除活动子窗口和主窗口之外的所有子窗口

本文关键字:窗口 活动 WPF | 更新日期: 2023-09-27 18:36:19

我有如下 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();
    }
}

谢谢。

WPF 关闭除活动子窗口和主窗口之外的所有子窗口

据我所知,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() 处引发异常。

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

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

不要纠结于子类或更多列表(特别是因为代码已经有一个与之关联的窗口列表。

如果要有选择地关闭窗口,则始终可以修改 if 语句以在窗口类上使用变量或检查基窗口类上预先存在的变量之一(例如父窗口的类)。