在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
有开放的集合Windows
的Application
类,你可以做检查的辅助方法,如果窗口开启.
这里是会检查是否有任何的例子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)
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)
这是使用 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)