excuted我有一個「加載應用程序」加載一個菜單,當用戶點擊菜單圖像按鈕列表視圖中打開基於文本獲取打開的窗口的列表形式實例是從不同的裝配
(if text = employee)
(Go to class A)
(Go to class B)
...
...
(Show List View Window)
如果他再次點擊相同的按鈕,它會再次打開,我想阻止它。 即,但是這對於WPF應用程序
excuted我有一個「加載應用程序」加載一個菜單,當用戶點擊菜單圖像按鈕列表視圖中打開基於文本獲取打開的窗口的列表形式實例是從不同的裝配
(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;
}
馬克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();
}
}
另一個簡單的例子
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;
}
首先,謝謝您的回覆。 參考你的第一個代碼片段。 問題是Application.OpenForms(沒有顯示 的表單,它只是一個加載程序)以及 Assembly currentAssembly = Assembly.GetExecutingAssembly(); 看起來很有前途...代碼應該是反向..mmmm – abmv 2008-12-23 13:52:27
Application.OpenForms將返回0,即因爲它是加載器 – abmv 2008-12-23 13:55:55
我不知道爲什麼你的主表單只是一個加載器應該影響結果在這裏...如果運行時知道窗體,它應該出現在Application.OpenForms - 除非你的意思是它運行在不同的*進程* - 是它嗎? – 2008-12-23 13:57:44