c# Application.Current. Windows не включает все windows - PullRequest
1 голос
/ 26 марта 2020

В приложении мне нужно открыть несколько всплывающих окон, но нужно проверить, существует ли уже всплывающее окно с заданной ссылкой (guid). Если это так, я сначала закрою существующее всплывающее окно и открою новое. Я использую приведенный ниже код, но похоже, что моя частичная переменная класса Guid сбрасывается каждый раз, когда создается новое всплывающее окно, и поэтому условие MRwin.GetGuid () == this.guid всегда имеет значение true. Это как если бы переменная guid была объявлена ​​как stati c: -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();
        }
      }
    }
  }
}

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Это плохая работа для конструктора. Если вам не нужно создавать окно, не создавайте его. Создание и последующее закрытие нецелесообразно. И это вызывает вашу проблему, так как ваше недавно созданное частично окно уже находится в списке Application.Current.Windows!

Вместо использования такого рода логики c в конструкторе, используйте stati c метод (или фабрика):

public static MyPopup OpenPopup(Guid guid) =>
  Application.Current.Windows
    .OfType<Forms.MyPopup>()
    .FirstOrDefault(w => w.GetGuid() == guid)
  ?? new MyPopup(guid);

(не стесняйтесь возвращать null, если вы не хотите возвращать ссылку на существующее всплывающее окно).

0 голосов
/ 26 марта 2020

Наконец, Application.Current. Windows не включал один из открытых windows, безусловно, из-за многопоточности. Чтобы решить эту проблему, я решил создать и поддерживать список открытых windows, используя список c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...