我如何知道是否打开了WPF窗口

gui*_*cgs 32 c# wpf window

在WPF窗口中,我如何知道它是否已打开?

我的目标是当时只打开一个窗口实例.

所以,父窗口中的伪代码是:

if (this.m_myWindow != null)
{
    if (this.m_myWindow.ISOPENED) return;
}

this.m_myWindow = new MyWindow();
this.m_myWindow.Show();
Run Code Online (Sandbox Code Playgroud)

编辑:

我找到了解决我最初问题的解决方案.window.ShowDialog();

它阻止用户打开任何其他窗口,就像模式弹出窗口一样.使用此命令,无需检查窗口是否已打开.

sa_*_*213 72

WPF有开放的集合WindowsApplication类,你可以做检查的辅助方法,如果窗口开启.

这里是会检查是否有任何的例子Window有一定的Type或者如果Window具有一定的名字是开放的,或两者兼而有之.

public static bool IsWindowOpen<T>(string name = "") where T : Window
{
    return string.IsNullOrEmpty(name)
       ? Application.Current.Windows.OfType<T>().Any()
       : Application.Current.Windows.OfType<T>().Any(w => w.Name.Equals(name));
}
Run Code Online (Sandbox Code Playgroud)

用法:

if (Helpers.IsWindowOpen<Window>("MyWindowName"))
{
   // MyWindowName is open
}

if (Helpers.IsWindowOpen<MyCustomWindowType>())
{
    // There is a MyCustomWindowType window open
}

if (Helpers.IsWindowOpen<MyCustomWindowType>("CustomWindowName"))
{
    // There is a MyCustomWindowType window named CustomWindowName open
}
Run Code Online (Sandbox Code Playgroud)

  • 根据文档`Application.Current.Windows`是已经实例化的所有Windows的列表(不一定是打开的) (2认同)

jur*_*ure 10

您可以检查是否m_myWindow==null只有创建和显示窗口.窗口关闭时,将变量设置为null.

    if (this.m_myWindow == null)
    {
           this.m_myWindow = new MyWindow();
           this.m_myWindow.Closed += (sender, args) => this.m_myWindow = null;           
           this.m_myWindow.Show();
    }
Run Code Online (Sandbox Code Playgroud)


Mik*_*son 7

这是使用 LINQ 实现此目的的另一种方法。

using System.Linq;

...

public static bool IsOpen(this Window window)
{
    return Application.Current.Windows.Cast<Window>().Any(x => x == window);
}
Run Code Online (Sandbox Code Playgroud)

用法:

bool isOpen = myWindow.IsOpen();
Run Code Online (Sandbox Code Playgroud)