我如何知道是否打开了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); }