我有一个加载菜单的“加载器应用程序”,当用户单击菜单图像按钮时,会根据文本打开一个列表视图
(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<Form> formsFromOtherAssemblies = new List<Form>();
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;
}
您可以使用命令模式。加载程序集将在加载的程序集中搜索命令。对于每个命令,加载程序都会创建菜单项(或您想要的任何其他内容),并且单击事件将运行具体命令。
该命令必须知道是否应该创建新表单或使用一些已经存在的表单。
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();
}
}