Windows.Formsの複数のインスタンスを防ぐ方法については非常に多くのトピックが見つかりましたが、WPFウィンドウの複数のインスタンスを防ぐ方法はまだ見つかりません。私の考えを説明します。私はWPFウィンドウを持っています。このウィンドウには、美しいカスタムボタンがあります。ボタンをクリックすると、新しいウィンドウが開きます。私の問題は、同じボタンで複数回クリックすると、同じウィンドウがボタンをクリックした回数だけ表示されることです。これを防ぐ方法は?新しいウィンドウが開かれているだけで、既に開かれているものがフォーカスを取ることは可能ですか?新しいインスタンスを作成する代わりに、作成したウィンドウにフォーカスを与える方法を教えてください。
答えて
私はいくつかの方法を見てきましたが、これは私が使用している方法です。その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
のように見えるフォームを開くしようとしているときに、この
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();
}
私は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を使用したいと言います。
- 1. ブログのコメント作成方法を教えてください
- 2. プラグインプログラミングの作成方法を教えてください。
- 3. 新しいタブでダウンロードまたは開くオプションをユーザーに与える方法を教えてください。
- 4. wpfで良いプリントを作成する方法を教えてください。
- 5. Flex4でカスタムMXAdvancedDataGridItemRendererを作成する方法を教えてください。
- 6. 新しいファイルが作成されるたびに作成するファイルの番号を増やす方法を教えてください。
- 7. RichTextBoxにフラットな外観を与える方法を教えてください。
- 8. ConfigurationManager.ConnectionStringsに.ASHXアクセス権を与える方法を教えてください。
- 9. golangでオブジェクトを作成した後にメソッドを使用する方法を教えてください。
- 10. RRを使用してスタブオブジェクトを作成および割り当てる方法を教えてください。
- 11. dict.fromkeysを使用して各キーに一意の値を作成する方法を教えてください。
- 12. NSWindowを常にアクティブ/フォーカスにする方法を教えてください。
- 13. cancanを使用してrolifyを追加して作成する方法を教えてください。
- 14. 新しいインスタンスを作成する代わりに値を変更する
- 15. Delphi Galileo IDEエキスパートの作成方法を教えてください。
- 16. GUI、ウィジェット、UI:針ゲージの作成方法を教えてください。
- 17. 安全なJEXL(スクリプティング)サンドボックスの作成方法を教えてください。
- 18. 拡張メソッド(F#)の作成方法を教えてください。
- 19. Jenkins(旧称Hudson)プラグインの作成方法を教えてください。
- 20. Microsoft Owinロギング - Web Api 2 - ロガーの作成方法を教えてください。
- 21. C#このスレッドアプリケーションの作成方法を教えてください。
- 22. IEに適したカスタマイズ方法を教えてください。
- 23. 独自のファイルタイプを操作するためのVisual Studioプラグインの作成方法を教えてください。
- 24. segueを置き換えて新しいインスタンスを作成する
- 25. Twitter APIに基づいて関心グラフを作成する方法を教えてください。
- 26. テーブルが作成されているかどうかを確認する方法を教えてください。
- 27. $ .ajax()から取得した要素にCSSプロパティを与える方法を教えてください。
- 28. ユーザーがスケジュールを作成してコード(.net)を実行する方法を教えてください。
- 29. checkdnsrrにMXの代わりにSpamhaus.orgを使用させる方法を教えてください。
- 30. リフレクトでパラメータリストの代わりにObject []を渡してクラスの新しいインスタンスを作成する方法
ありがとうございます!あなたは私の問題を決めました。 –