我如何知道是否打开了WPF窗口
在WPF窗口中,我如何知道它是否已打开?
我的目标是当时只打开一个窗口实例。
所以,父窗口中的伪代码是:
if (this.m_myWindow != null) { if (this.m_myWindow.ISOPENED) return; } this.m_myWindow = new MyWindow(); this.m_myWindow.Show();
编辑:
我找到了解决我最初问题的解决方案。 window.ShowDialog();
它阻止用户打开任何其他窗口,就像模式弹出窗口一样。 使用此命令,无需检查窗口是否已打开。
在WPF
中, Application
类中有一个打开的Windows
集合,您可以创建一个帮助方法来检查窗口是否打开。
下面是一个示例,它将检查某个Type
任何Window
或具有特定名称的Window
是否打开,或两者都是。
public static bool IsWindowOpen(string name = "") where T : Window { return string.IsNullOrEmpty(name) ? Application.Current.Windows.OfType ().Any() : Application.Current.Windows.OfType ().Any(w => w.Name.Equals(name)); }
用法:
if (Helpers.IsWindowOpen("MyWindowName")) { // MyWindowName is open } if (Helpers.IsWindowOpen()) { // There is a MyCustomWindowType window open } if (Helpers.IsWindowOpen ("CustomWindowName")) { // There is a MyCustomWindowType window named CustomWindowName open }
您可以检查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(); }
如果您需要激活窗口,则可以使用以下代码:
//activate a window found //T = Window Window wnd = Application.Current.Windows.OfType().Where(w => w.Name.Equals(nome)).FirstOrDefault(); wnd.Activate();
这是使用LINQ实现此目的的另一种方法。
using System.Linq; ... public static bool IsOpen(this Window window) { return Application.Current.Windows.Cast().Any(x => x == window); }
用法:
bool isOpen = myWindow.IsOpen();
在你的类中放一个静态bool,名为_open
或类似的东西。 在构造函数中,然后执行以下操作:
if (_open) { throw new InvalidOperationException("Window already open"); } _open = true;
在封闭事件中:
_open = false;
你在搜索吗?
if (this.m_myWindow != null) { if (this.m_myWindow.IsActive) return; } this.m_myWindow = new MyWindow(); this.m_myWindow.Show();
如果你想要一个单例,你应该读一下: 我们如何为一个Window创建一个Singleton实例?
void pencereac (int Ops) where T : Window , new() { if (!Application.Current.Windows.OfType ().Any()) // Check is Not Open, Open it. { var wind = new T(); switch (Ops) { case 1: wind.ShowDialog(); break; case 0: wind.Show(); break; } } else Application.Current.Windows.OfType ().First().Activate(); // Is Open Activate it. }
Kullanımı:
void Button_1_Click(object sender, RoutedEventArgs e) { pencereac(1); }