2010-07-20 70 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(); 
} 

话虽这么说,我需要检查,看看是否窗口已经打开,如果它是集中化妆,否则,创建一个新的窗口,并将重点。

考虑到十字线。

问:什么是最好的方法来实现这一点。

回答

1

有一个Application.OpenForms属性,跟踪开放形式 - 不确定其线程的安全性。

1

MSDNFormCollection方法不保证是线程安全的。所以它是更有意义的旋转你自己的收集是同步的,并附加到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

所以,你说的是什么,我应该创建自己的收藏'键,Value'和分配UID到每个窗口,然后使用'WindowCollection [UID] .Value.InvokeRequired',这将是最好的方式吗?,我不认为我需要WindowCreate,因为我已经创建了窗体,并且它的启动取决于名册。 – RobertPitt 2010-07-20 12:13:03

+0

我添加了一些示例代码,让您了解该过程。你可以决定你想用什么键,但过程是一样的。 – unholysampler 2010-07-20 14:16:38

+0

或者,您可以将访问权限封装到表单集合并提供您自己的锁定。另外,如果你有很多独立的线程,他们将如何分享表单? – 2010-07-20 15:00:17