【问题标题】:How do I know if a WPF window is opened我如何知道是否打开了 WPF 窗口
【发布时间】:2013-04-18 14:25:23
【问题描述】:

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

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

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

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

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

编辑:

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

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

【问题讨论】:

  • 感谢您的更新! window.ShowDialog() 正是我所需要的!

标签: c# wpf window


【解决方案1】:

如果您想检查第二个表单是否已打开并避免在按钮单击时再次打开它,则此方法有效。

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
   {   
{

【讨论】:

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

    【讨论】:

    • 格式化您的代码并解释为什么这样做以及它的作用。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
          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.
          }
      

      库拉尼米:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          是你搜索的吗?

          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?

          【讨论】:

          • 您好,IsActive 属性不起作用。我认为它只检查窗口是否有焦点(我不确定)
          【解决方案7】:

          WPF 中有一个Application 类中打开的Windows 的集合,您可以创建一个辅助方法来检查窗口是否打开。

          这是一个示例,它将检查某个 Type 中是否有任何 Window 或具有特定名称的 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
          }
          

          【讨论】:

          • 这是一个很好的解决方案!谢谢。但是因为我找到了另一种方法来解决我的问题,所以我不会使用它。
          • @guilhermecgs 你找到什么更简单的方法来解决你的问题?
          • @estebro - 我使用了一个模态弹出窗口。我的要求是避免用户与其他打开的窗口进行交互。因此,模态弹出窗口根据定义可以做到这一点。 stackoverflow.com/questions/499294/…
          • 有没有办法将它用于在另一个线程上运行的 wpf 窗口?如果是,有人可以发布一个简单的例子吗?
          • 根据文档Application.Current.Windows 是已经实例化的所有Windows的列表(不一定是打开的)
          【解决方案8】:

          在您的类中放置一个静态布尔值,命名为_open 或类似名称。 然后在构造函数中这样做:

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

          在关闭事件中:

          _open = false;
          

          【讨论】:

            【解决方案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();
                }
            

            【讨论】:

            • @ofstream 的类似解决方案
            • 只是出于兴趣,这段代码中是否存在内存泄漏,因为我们从未删除关闭的事件处理程序,或者将对象设置为 null 会删除所有事件处理程序?
            • @user1 我知道这是旧的,但是是的;是的,它确实会造成内存泄漏。我目前正在尝试找到一种方法来解决托盘应用程序中的内存泄漏问题,该应用程序会产生不同的窗口并将它们同步到一个变量上。
            • @JoshHetland 你不能在关闭事件中删除窗口的事件处理程序吗?您可能会使用显式方法而不是匿名方法来执行此操作。我认为这将摆脱内存泄漏
            • 是的,但是在使用我广泛使用的 lamda 时,我还没有找到一种方法。
            猜你喜欢
            • 2015-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多