获取从不同程序集中执行的打开窗口表单实例的列表
我有一个加载菜单的“加载程序应用程序”,当用户单击菜单图像按钮时,列表视图会根据文本打开
(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
如果您只想跟踪自己打开的表单,请缓存该实例。 或者,如果您使用“拥有的表单”,您只需按名称检查:
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(); } }