web-dev-qa-db-ja.com

WPFウィンドウが開いているかどうかを知る方法

WPFウィンドウで、開いているかどうかをどのように知るのですか?

一度にウィンドウのインスタンスを1つだけ開くことが私の目標です。

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

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

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

編集:

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

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

31
guilhermecgs

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

特定のWindowTypeがあるか、特定の名前のWindowが開いているか、またはその両方をチェックする例を次に示します。

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
}
71
sa_ddam213

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();
    }
10
jure

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();
4
Mike Eason

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

//activate a window found
//T = Window

 Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault();
 wnd.Activate();
2
Mauricio Ferraz

_openなどの名前のクラスに静的ブールを配置します。コンストラクターでこれを行います:

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

そして、Closedイベントで:

_open = false;
1
It'sNotALie.
    void  pencereac<T> (int Ops) where T : Window , new()
    {
        if (!Application.Current.Windows.OfType<T>().Any()) // Check is Not Open, Open it.
        {
           var wind = new T();
            switch (Ops)
            {
                case 1:
                    wind.ShowDialog();
                    break;
                case 0:
                    wind.Show();
                    break;
            }
        }
        else Application.Current.Windows.OfType<T>().First().Activate(); // Is Open Activate it.
    }

クラニム:

void Button_1_Click(object sender, RoutedEventArgs e)
{
  pencereac<YourWindow>(1);
}

あなたは検索していますか?

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

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

シングルトンが必要な場合は、これをお読みください: ウィンドウのシングルトンインスタンスを作成するにはどうすればよいですか?

0
Floc