获取从不同程序集中执行的打开窗口表单实例的列表

我有一个加载菜单的“加载程序应用程序”,当用户单击菜单图像按钮时,列表视图会根据文本打开

(if text = employee) (Go to class A) (Go to class B) ... ... (Show List View Window) 

如果他再次点击它再次打开的同一个按钮,我想阻止这一点。 即但是这适用于WPF应用程序

如果需要打开表单的列表,那就是Application.OpenForms 。 您可以使用GetType()并检查.Assembly来查找来自不同程序集的那些内容。 除此之外,我对这个问题并不完全清楚……

  Assembly currentAssembly = Assembly.GetExecutingAssembly(); List
formsFromOtherAssemblies = new List
(); foreach (Form form in Application.OpenForms) { if (form.GetType().Assembly != currentAssembly) { formsFromOtherAssemblies.Add(form); } }

如果您只想跟踪自己打开的表单,请缓存该实例。 或者,如果您使用“拥有的表单”,您只需按名称检查:

  private void button1_Click(object sender, EventArgs e) { foreach (Form form in OwnedForms) { if (form.Name == "Whatever") { form.Activate(); return; } } Form child = new Form(); child.Name = "Whatever"; child.Owner = this; child.Show(this); } 
  NewProduct newproduct; private void button1_Click(object sender, EventArgs e) { if(!isOpened()) { newproduct = new NewProduct(); newproduct.Show(); } } private bool isOpened() { foreach (Form f in Application.OpenForms) { if (f == newproduct) { return true; } } return false; } 

另一个简单例子

 private Boolean FindForm(String formName) { foreach (Form f in Application.OpenForms) { if (f.Name.Equals(formName)) { f.Location = new Point(POINT.X, POINT.Y + 22); return true; } } return false; } 

您可以使用命令模式。 加载程序集将在已加载的程序集中搜索命令。 对于每个命令,加载器创建菜单项(或其他任何你想要的),click事件将运行具体命令。

该命令必须知道是应该创建新表单还是使用已存在的表单。

Mark Garvell的回答帮助我弄清楚我应该做些什么,但需要调整WPF。

(在我的情况下,我想在关闭时关闭不属于主窗口的任何窗口,但原理是相同的。)

 private void EmployeeMenuItemClick(object sender, RoutedEventArgs e) { bool found = false; foreach(Window w in Application.Current.Windows) { if(w.GetType() == typeof(EmployeeListViewWindow) { found = true; break; } } if(!found) { EmployeeListViewWindow ew = new EmployeeListViewWindow(); ew.Show(); } }