C # WinForms, отслеживание окон - PullRequest
0 голосов
/ 20 июля 2010

Лучший способ отслеживать несколько окон в C # WinForms.

Например, у меня есть ApplicationContext, который используется для управления моим приложением, и у меня есть метод, который используется для открытия новых окон.

public void CreateWindow(RosterItem Roster)
{
   //Check if it is already active, if so, Focus.
   MessageWindow MessageWindow = new MessageWindow();
   MessageWindow.SetContext(Roster);
   MessageWindow.Initialize();
}

При этом мне нужно проверить, открыто ли окно и является ли оно сфокусированным, в противном случае создайте новое окно и сфокусируйте его.

Принимая во внимание Cross Thread.

Q: Каков наилучший способ сделать это.

Ответы [ 2 ]

1 голос
/ 20 июля 2010

MSDN говорит, что методы FormCollection не гарантируют многопоточность. Поэтому имеет смысл прокрутить собственную коллекцию, которая синхронизирована и добавлена ​​в конце CreateWindow. Таким образом, у вас будет одно место для проверки, когда вы собираетесь создать новое окно. Вы также получаете бонус за то, что форма набрана так, как вы этого хотите, и вам не нужно выполнять кастинг.

Пример того, как это может работать, где windowCollection - статический словарь, который может видеть каждая нить:

public Form GetWindow(RosterItem roster) {
  Form result;
  lock(windowCollection) {
    if (windowCollection.TryGetValue(roster, out result))
      return result;
    result = new MyForm(roster);
    windowCollection.Add(roster, result);
    return result;
  }
}
1 голос
/ 20 июля 2010

Существует свойство Application.OpenForms, которое отслеживает открытые формы - хотя и не уверен в его безопасности потоков.

...