40

WPF ウィンドウで、ウィンドウが開いているかどうかを確認するにはどうすればよいですか?

一度にウィンドウのインスタンスを1つだけ開くという私の目標。

したがって、親ウィンドウの擬似コードは次のとおりです。

if (this.m_myWindow != null)
{
    if (this.m_myWindow.ISOPENED) return;
}

this.m_myWindow = new MyWindow();
this.m_myWindow.Show();

編集:

最初の問題を解決する解決策を見つけました。window.ShowDialog();

モーダルポップアップと同様に、ユーザーが他のウィンドウを開くのをブロックします。このコマンドを使用すると、ウィンドウが既に開いているかどうかを確認する必要はありません。

4

9 に答える 9

89

クラスに openのWPFコレクションがあり、ウィンドウが開いているかどうかを確認するヘルパー メソッドを作成できます。WindowsApplication

以下は、特定の が開いているか、特定の名前の が開いているか、またはその両方でWindowあるかを確認する例です。TypeWindow

public static bool IsWindowOpen<T>(string name = "") where T : Window
{
    return string.IsNullOrEmpty(name)
       ? Application.Current.Windows.OfType<T>().Any()
       : Application.Current.Windows.OfType<T>().Any(w => w.Name.Equals(name));
}

使用法:

if (Helpers.IsWindowOpen<Window>("MyWindowName"))
{
   // MyWindowName is open
}

if (Helpers.IsWindowOpen<MyCustomWindowType>())
{
    // There is a MyCustomWindowType window open
}

if (Helpers.IsWindowOpen<MyCustomWindowType>("CustomWindowName"))
{
    // There is a MyCustomWindowType window named CustomWindowName open
}
于 2013-04-25T01:07:15.430 に答える
13

m_myWindow==nullウィンドウを作成して表示するかどうかを確認してからのみ確認できます。ウィンドウが閉じたら、変数を null に戻します。

    if (this.m_myWindow == null)
    {
           this.m_myWindow = new MyWindow();
           this.m_myWindow.Closed += (sender, args) => this.m_myWindow = null;           
           this.m_myWindow.Show();
    }
于 2013-04-24T21:11:32.800 に答える
7

LINQ を使用してこれを実現する別の方法を次に示します。

using System.Linq;

...

public static bool IsOpen(this Window window)
{
    return Application.Current.Windows.Cast<Window>().Any(x => x == window);
}

使用法:

bool isOpen = myWindow.IsOpen();
于 2017-04-21T13:29:06.060 に答える
2

ウィンドウが見つかった場合にウィンドウをアクティブにする必要がある場合は、次のコードを使用できます。

//activate a window found
//T = Window

 Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault();
 wnd.Activate();
于 2015-03-09T14:37:46.703 に答える
1

クラスに名前付きの静的ブール値_openなどを入れます。コンストラクターで次のようにします。

if (_open)
{
    throw new InvalidOperationException("Window already open");
}
_open = true;

および Closed イベントでは:

_open = false;
于 2013-04-24T21:35:54.310 に答える