c#Application.Current.Windows不包括所有窗口

c#Application.Current.Windows不包括所有窗口,c#,C#,在应用程序中,我需要打开多个弹出窗口,但需要检查是否已经存在具有给定引用(guid)的弹出窗口。如果是这样,我将首先关闭现有的弹出窗口并打开一个新的弹出窗口。我正在使用下面的代码,但是如果每次创建新的弹出窗口时都重置部分类变量Guid,那么条件MRwin.GetGuid()==this.Guid始终为真。这就像guid变量被声明为静态:-S一样 有什么想法吗 public partial class MyPopup: MetroWindow { private Guid guid;

在应用程序中,我需要打开多个弹出窗口,但需要检查是否已经存在具有给定引用(guid)的弹出窗口。如果是这样,我将首先关闭现有的弹出窗口并打开一个新的弹出窗口。我正在使用下面的代码,但是如果每次创建新的弹出窗口时都重置部分类变量Guid,那么条件MRwin.GetGuid()==this.Guid始终为真。这就像guid变量被声明为静态:-S一样 有什么想法吗

public partial class MyPopup: MetroWindow 
{
  private Guid guid;

  public Guid GetGuid() 
  {
    return guid;
  }

  public MyPopup(Guid guid) 
  {
    InitializeComponent();
    this.guid = guid;

    foreach(var win in Application.Current.Windows) 
    {
      if (win is Forms.MyPopup) 
      {
        Forms.MyPopup cWin = (Forms.MyPopup) win;

        // Close if there is any open popup window related to the same Guid
        if (cWin.GetGuid() == this.guid) 
        {
          cWin.Close();
        }
      }
    }
  }
}

对于构造函数来说,这是一项糟糕的工作。如果不需要创建窗口,请不要创建它。创建它然后关闭它是不合理的。这会导致您的问题,因为您新创建的部分窗口已经在
应用程序.Current.Windows
列表中

使用静态方法(或工厂)代替构造函数中的此类逻辑:

公共静态MyPopup OpenPopup(Guid)=>
Application.Current.Windows
第()类
.FirstOrDefault(w=>w.GetGuid()==guid)
?? 新MyPopup(guid);

(如果您不想返回对现有弹出窗口的引用,请随意返回
null

这对构造函数来说是一项糟糕的工作。如果不需要创建窗口,请不要创建它。创建它然后关闭它是不合理的。这会导致您的问题,因为您新创建的部分窗口已经在
应用程序.Current.Windows
列表中

使用静态方法(或工厂)代替构造函数中的此类逻辑:

公共静态MyPopup OpenPopup(Guid)=>
Application.Current.Windows
第()类
.FirstOrDefault(w=>w.GetGuid()==guid)
?? 新MyPopup(guid);

(如果您不想返回对现有弹出窗口的引用,请随意返回
null

最后,Application.Current.Windows由于线程问题没有包含一个打开的窗口。
为了解决这个问题,我决定使用一个静态列表创建并维护一个打开的窗口列表。

最后,Application.Current.windows没有包含一个打开的窗口,当然是因为线程问题。

为了解决这个问题,我决定使用静态列表创建并维护一个已打开窗口的列表。

您提供的代码将无法编译-您正在尝试将
字符串
值分配给
Guid
变量。为了可读性,我还建议您以更传统的C#方式格式化代码,至少在堆栈溢出时是这样。(我还建议使用属性而不是
GetGuid
方法…)请注意,我们也不知道是什么提供了构造函数参数。如果每次都传入相同的值,那么请确保所有窗口都相同。。。请提供一份表格,以便我们可以帮助您。打字错误?在构造函数中,使用字符串值分配Guid类型字段。如何将Guid分配给这些弹出窗口?你确定他们不一样吗?嗨,汉斯,乔恩,谢谢你的快速反馈。很抱歉在简化代码时出现了拼写错误,它已更新。是的,值是不同的:当我创建新的弹出窗口时,我会打印每次都不同的Guid。然后,当通过表单的循环访问指南时,它们似乎被删除了,我不知道为什么/什么时候。您提供的代码无法编译-您试图将
字符串
值分配给
Guid
变量。为了可读性,我还建议您以更传统的C#方式格式化代码,至少在堆栈溢出时是这样。(我还建议使用属性而不是
GetGuid
方法…)请注意,我们也不知道是什么提供了构造函数参数。如果每次都传入相同的值,那么请确保所有窗口都相同。。。请提供一份表格,以便我们可以帮助您。打字错误?在构造函数中,使用字符串值分配Guid类型字段。如何将Guid分配给这些弹出窗口?你确定他们不一样吗?嗨,汉斯,乔恩,谢谢你的快速反馈。很抱歉在简化代码时出现了拼写错误,它已更新。是的,值是不同的:当我创建新的弹出窗口时,我会打印每次都不同的Guid。然后,当通过表单的循环访问指南时,它们似乎被删除了,我不知道为什么/什么时候。谢谢。事实上,需求略有不同。根据触发器,我需要更新/刷新多个弹出窗口值,或者(我选择的选项),关闭特定的弹出窗口并打开一个具有刷新值的新弹出窗口。无论如何,我尝试了您的方法,但似乎在使用静态方法时未设置Application.Current.Windows。好的,因此我发现了问题:Application.Current.Windows有时会错过返回一个活动窗体。看起来是第一个打开的,但我不知道为什么。。。我在主线程中只调用了一次构造函数+1获取有用的“新创建的部分窗口已在Application.Current.Windows列表中!”@Salim您正在UI线程上创建所有窗口吗?处理多线程UI非常棘手
Application.Current.Windows
跟踪在当前线程上创建的所有窗口。@Salim应用程序是线程安全的。你确定你没有在构造函数(或静态构造函数)中做一些奇怪的事情吗?所有的窗口都是WPF窗口吗?另外请注意,您创建的第一个窗口将成为
应用程序.Current.MainWindow
,因此第一个窗口总是有点特殊。@Salim我不知道Outlook加载项的线程/域模型是什么,抱歉:)这绝对是一个特殊情况,可能会对您尝试执行的操作产生意外影响。谢谢。事实上,需求略有不同。根据触发器,我需要更新/刷新多个弹出窗口值,或者(我选择的选项),关闭特定的弹出窗口并打开一个具有刷新值的新弹出窗口。不管怎样,我知道
public static MyPopup OpenPopup(Guid guid) =>
  Application.Current.Windows
    .OfType<Forms.MyPopup>()
    .FirstOrDefault(w => w.GetGuid() == guid)
  ?? new MyPopup(guid);