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

时间:2013-04-24 21:01:05

标签: c# wpf window

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

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

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

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

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

编辑:

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

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

9 个答案:

答案 0 :(得分:71)

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));
}

用法:

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
}

答案 1 :(得分:9)

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

答案 2 :(得分:4)

以下是使用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();

答案 3 :(得分:2)

如果需要激活窗口,可以使用以下代码:

//activate a window found
//T = Window

 Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault();
 wnd.Activate();

答案 4 :(得分:1)

在你的班级中添加一个静态bool,名为_open或类似的东西。 在构造函数中,然后执行以下操作:

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

并在已结束的事件中:

_open = false;

答案 5 :(得分: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?

答案 6 :(得分: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);
}

答案 7 :(得分:0)

如果您要检查“第二个表单”是否已经打开并避免在buttong单击上再次打开它,则此方法有效。

int formcheck = 0;
private void button_click()
{
   Form2Name myForm2 = new Form2Name();
   if(formcheck == 0)
   {
      myForm2.Show(); //Open Form2 only if its not active and formcheck == 0
      // Do Somethin

      formcheck = 1; //Set it to 1 indicating that Form2 have been opened
   {   
{

答案 8 :(得分:-1)

public bool IsWindowOpen<T>(string name = "") where T : Window
{
    return Application.Current.Windows.OfType<T>().Any(w => w.GetType().Name.Equals(name));               
}