在WPF窗口中,我如何知道它是否已打开?
我的目标是当时只打开一个窗口实例。
所以,父窗口中的伪代码是:
if (this.m_myWindow != null)
{
if (this.m_myWindow.ISOPENED) return;
}
this.m_myWindow = new MyWindow();
this.m_myWindow.Show();
编辑:
我找到了解决我最初问题的解决方案。 window.ShowDialog();
它阻止用户打开任何其他窗口,就像模式弹出窗口一样。 使用此命令,无需检查窗口是否已打开。
答案 0 :(得分:71)
在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
}
答案 1 :(得分:9)
您可以检查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();
}
答案 2 :(得分:4)
以下是使用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();
答案 3 :(得分:2)
如果需要激活窗口,可以使用以下代码:
//activate a window found
//T = Window
Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault();
wnd.Activate();
答案 4 :(得分:1)
在你的班级中添加一个静态bool,名为_open
或类似的东西。
在构造函数中,然后执行以下操作:
if (_open)
{
throw new InvalidOperationException("Window already open");
}
_open = true;
并在已结束的事件中:
_open = false;
答案 5 :(得分:0)
你在搜索吗?
if (this.m_myWindow != null)
{
if (this.m_myWindow.IsActive) return;
}
this.m_myWindow = new MyWindow();
this.m_myWindow.Show();
如果你想要一个单身人士,你应该阅读:How can we create a Singleton Instance for a Window?
答案 6 :(得分:0)
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.
}
Kullanımı:
void Button_1_Click(object sender, RoutedEventArgs e)
{
pencereac<YourWindow>(1);
}
答案 7 :(得分:0)
如果您要检查“第二个表单”是否已经打开并避免在buttong单击上再次打开它,则此方法有效。
int formcheck = 0;
private void button_click()
{
Form2Name myForm2 = new Form2Name();
if(formcheck == 0)
{
myForm2.Show(); //Open Form2 only if its not active and formcheck == 0
// Do Somethin
formcheck = 1; //Set it to 1 indicating that Form2 have been opened
{
{
答案 8 :(得分:-1)
public bool IsWindowOpen<T>(string name = "") where T : Window
{
return Application.Current.Windows.OfType<T>().Any(w => w.GetType().Name.Equals(name));
}