2013-04-24 227 views
25

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

我的目标是当时只打开1个窗口实例。

因此,在父窗口我的伪代码为:

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

this.m_myWindow = new MyWindow(); 
this.m_myWindow.Show(); 

编辑:

我发现,解决我最初的问题的解决方案。 window.ShowDialog();

它阻止用户打开任何其他窗口,就像模态弹出窗口一样。 使用此命令,不需要检查窗口是否已经打开。

+1

感谢您的更新! window.ShowDialog()正是我需要的! – 2018-01-30 16:51:57

回答

60

WPF没有在Application类开放Windows的集合,你可以做一个辅助方法检查窗口是否打开。

下面是一个例子,它将检查某个TypeWindow或某个名称的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)); 
} 

用法:

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 
} 
+0

这是一个很好的解决方案!谢谢。但是因为我找到了解决我的问题的另一种方法,所以我不会使用它。 – guilhermecgs 2013-04-25 12:46:46

+0

@guilhermecgs你找到解决问题的更简单的方法吗? – estebro 2014-07-31 15:19:46

+1

@estebro - 我使用了一个模式弹出。我的要求是避免用户与其他打开的窗口进行交互。所以,一个模式弹出按照定义来做。 http://stackoverflow.com/questions/499294/how-do-make-modal-dialog-in-wpf – guilhermecgs 2014-07-31 17:52:21

8

您可以检查是否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(); 
    } 
+0

@ofstream的类似解决方案 – guilhermecgs 2013-04-25 12:48:41

+0

只是出于兴趣,这段代码中是否存在内存泄漏,因为我们从不删除关闭的事件处理程序或将对象设置为null删除所有事件处理程序? – user1 2015-04-07 11:39:15

+0

@ user1我知道这是旧的,但是;是的,它确实会造成内存泄漏。我目前正试图找到一种方法来解决托盘应用程序中的内存泄漏问题,该应用程序会生成不同的窗口并在变量上同步它们。 – JoshHetland 2015-04-14 03:48:50

1

把一个静态布尔在你的班级,名为_open或类似的东西。 在构造函数中,然后做到这一点:

if (_open) 
{ 
    throw new InvalidOperationException("Window already open"); 
} 
_open = true; 

,并在关闭事件:

_open = false; 
+3

它会工作,但我认为这不是一个“干净”的解决方案。 – guilhermecgs 2013-04-25 12:47:24

0

是你搜索?

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

this.m_myWindow = new MyWindow(); 
this.m_myWindow.Show(); 

如果你想有一个单身,你应该阅读:How can we create a Singleton Instance for a Window?

+1

嗨,IsActive属性不起作用。我认为它只检查窗口是否关注它(我不确定) – guilhermecgs 2013-04-25 12:41:42

2

如果你需要的,如果发现激活窗口,可以使用下面的代码:

//activate a window found 
//T = Window 

Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault(); 
wnd.Activate(); 
0
void pencereac<T> (int Ops) where T : Window , new() 
    { 
     if (!Application.Current.Windows.OfType<T>().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<T>().First().Activate(); // Is Open Activate it. 
    } 

Kullanımı:

void Button_1_Click(object sender, RoutedEventArgs e) 
{ 
    pencereac<YourWindow>(1); 
} 
0

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

using System.Linq; 

... 

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

用法:

bool isOpen = myWindow.IsOpen(); 
相关问题