2010-07-20 7 views
0

Лучший способ отслеживания нескольких окон в C# WinForms.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.

Вопрос: Каков наилучший способ для этого.

ответ

1

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

1

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; 
    } 
} 
+0

Так что ваше высказывание, что я должен создать свою собственную коллекцию 'Key, value' и назначить UID для каждого окна, а затем использовать 'WindowCollection [UID] .Value.InvokeRequired', это лучший способ? Я не думаю, что мне нужен WindowCreate, поскольку у меня уже есть созданная форма, и ее инициирование в зависимости от значений Реестр. – RobertPitt

+0

Я добавил несколько примеров кода, чтобы дать вам представление о процессе. Вы можете решить, что вы хотите использовать для ключа, но процесс тот же. – unholysampler

+0

В качестве альтернативы вы можете обернуть доступ к коллекции форм и предоставить свою собственную блокировку. Кроме того, если у вас много отдельных потоков, как они собираются обмениваться формами? –

Смежные вопросы