メニューをロードする「ローダーアプリ」があり、ユーザーがメニュー画像ボタンをクリックすると、テキストに基づいてリストビューが開きます
(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;
}
Command パターンを使用できます。ローダー アセンブリは、読み込まれたアセンブリ内のコマンドを検索します。コマンドごとに、ローダーがメニュー項目 (またはその他の必要なもの) を作成し、クリック イベントによって具体的なコマンドが実行されます。
コマンドは、新しいフォームを作成するか、既存のものを使用するかを認識している必要があります。
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();
}
}