2012-01-09 6 views
1

Windows.Formsの複数のインスタンスを防ぐ方法については非常に多くのトピックが見つかりましたが、WPFウィンドウの複数のインスタンスを防ぐ方法はまだ見つかりません。私の考えを説明します。私はWPFウィンドウを持っています。このウィンドウには、美しいカスタムボタンがあります。ボタンをクリックすると、新しいウィンドウが開きます。私の問題は、同じボタンで複数回クリックすると、同じウィンドウがボタンをクリックした回数だけ表示されることです。これを防ぐ方法は?新しいウィンドウが開かれているだけで、既に開かれているものがフォーカスを取ることは可能ですか?新しいインスタンスを作成する代わりに、作成したウィンドウにフォーカスを与える方法を教えてください。

答えて

1

私はいくつかの方法を見てきましたが、これは私が使用している方法です。そのVBでは、あなたはC#に変換することができるはずです。良い方法があるかもしれませんが、私はWPFの専門家ではありません!

私はあなたがする必要がまあ、私は、コードがこの

Dim FormToOpen As FormToOpen 
      If IsNothing(Find_form("FormToOpen")) Then 
       FormToOpen = New FormToOpen 
      Else 
       FormToOpen = Find_form("FormToOpen ") 
      End If 
      With FormToOpen 
       .Owner = Me 
       .ShowDialog() 
      .Activate 
         End with 
2

のように見えるフォームを開くしようとしているときに、この

Public Class FormsCollection 
     Public Shared Forms As ArrayList = New ArrayList 
    End Class 

    Public Function Find_form(strForm_name As String) 
     For Each F In FormsCollection.Forms 
      If F.ToString = strForm_name Then 
       Find_form = F 
       Exit Function 
      End If 
     Next 
     Find_form = Nothing 
    End Function 

のように見えるのモジュール内の関数を隠れています

疑似コード(ここにメモ帳がある)

private YourWindow wnd = null; 

void OnButton_Click() 
{ 
    if (wnd == null) wnd = new YourWindow(); 
    wnd.Show(); 
} 
1

私は2つのアプローチを使用する傾向があります。場合によっては、PowerRoyが示唆しているように、ウィンドウの参照を持つアプリケーション内の適切な中央の場所にフィールドを格納することもあります。そのフィールドがnullでない場合は、新しいインスタンスを作成するのではなく、そのフィールドをアクティブにします。

多くの種類のウィンドウがあるが、それぞれが必要な場合は、共通の基本クラス(おそらくList)のリストを使用します。作成された各ウィンドウがそこに配置され、作成するか、そのうちの1つに切り替えるたびに、タイプ別にフィルタリングし、そこに何かがあるかどうかを確認し、存在すればそれに切り替えます。ような何か:

List<Window> allWindows = new List<Window>(); 

// ... elsewhere I want to create a ShinyWindow 
void ActivateShinyWindow() 
{ 
    var shiny = allWindows.OfType<ShinyWindow>().FirstOrDefault(); 
    if (shiny == null) 
    { 
     shiny = new ShinyWindow(); 
     allWindows.Add(shiny); 
    } 
    ActivateWindow(shiny); 
} 

どこActivateWindow()それが見えるように、フロントまたは何にそれを持参する必要があるものは何でもありません。実際に私がこれをやっている最大のことは、タブ付きのインターフェースの中にあるので、それはすべて、囲んでいるシェルウィンドウによって実行されます。

これは、タイプ別にインデックスを作成していることを除いて、Kevin Rossの答えと少し違います。同じクラスのインスタンスである複数のウィンドウが必要な場合は、明らかに機能しません。そして、Kevinが行ったようなものがもっと必要になるでしょう。私の強く型付けされた関数型プログラミングの背景によれば、文字列よりもむしろウィンドウを索引付けするのにいいenumを使用したいと言います。

+0

ありがとうございます!あなたは私の問題を決めました。 –

関連する問題