WPFウィンドウで、開いているかどうかをどのように知るのですか?
一度にウィンドウのインスタンスを1つだけ開くことが私の目標です。
したがって、親ウィンドウでの私の擬似コードは次のとおりです。
if (this.m_myWindow != null)
{
if (this.m_myWindow.ISOPENED) return;
}
this.m_myWindow = new MyWindow();
this.m_myWindow.Show();
編集:
最初の問題を解決する解決策を見つけました。 window.ShowDialog();
モーダルポップアップのように、ユーザーが他のウィンドウを開くのをブロックします。このコマンドを使用すると、ウィンドウがすでに開いているかどうかを確認する必要はありません。
WPF
には、Windows
クラスに開いているApplication
のコレクションがあり、ウィンドウが開いているかどうかを確認するヘルパーメソッドを作成できます。
特定のWindow
のType
があるか、特定の名前の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
}
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();
}
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();
ウィンドウが見つかった場合にアクティブにする必要がある場合は、次のコードを使用できます。
//activate a window found
//T = Window
Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault();
wnd.Activate();
_open
などの名前のクラスに静的ブールを配置します。コンストラクターでこれを行います:
if (_open)
{
throw new InvalidOperationException("Window already open");
}
_open = true;
そして、Closedイベントで:
_open = false;
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();
シングルトンが必要な場合は、これをお読みください: ウィンドウのシングルトンインスタンスを作成するにはどうすればよいですか?