C# 如何知道WPF窗口是否已打开
在WPF窗口中,如何知道它是否已打开 我的目标是一次只打开一个窗口实例 因此,我在父窗口中的伪代码是:C# 如何知道WPF窗口是否已打开,c#,wpf,window,C#,Wpf,Window,在WPF窗口中,如何知道它是否已打开 我的目标是一次只打开一个窗口实例 因此,我在父窗口中的伪代码是: if (this.m_myWindow != null) { if (this.m_myWindow.ISOPENED) return; } this.m_myWindow = new MyWindow(); this.m_myWindow.Show(); 编辑: 我找到了解决我最初问题的方法。 ShowDialog() 它阻止用户打开任何其他窗口,就像模式弹出窗口一样。 使用此命
if (this.m_myWindow != null)
{
if (this.m_myWindow.ISOPENED) return;
}
this.m_myWindow = new MyWindow();
this.m_myWindow.Show();
编辑:
我找到了解决我最初问题的方法。
ShowDialog()
它阻止用户打开任何其他窗口,就像模式弹出窗口一样。
使用此命令,无需检查窗口是否已打开。您可以检查
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();
}
在类中放置一个名为
\u open
或类似的静态bool。
在构造函数中,然后执行以下操作:
if (_open)
{
throw new InvalidOperationException("Window already open");
}
_open = true;
在非公开活动中:
_open = false;
在
WPF
中,在应用程序
类中有一组打开的窗口
,您可以创建一个helper方法来检查窗口是否打开
下面是一个示例,该示例将检查某一类型的窗口是否打开,或者具有某一名称的窗口是否打开,或者两者都打开
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));
}
publicstaticboolswindowopen(stringname=“”)其中T:Window
{
返回字符串.IsNullOrEmpty(名称)
?Application.Current.Windows.OfType().Any()
:Application.Current.Windows.OfType().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
}
bool isOpen = myWindow.IsOpen();
if(Helpers.IsWindowOpen(“MyWindowName”))
{
//MyWindowName已打开
}
if(Helpers.IsWindowOpen())
{
//有一个MyCustomWindowType窗口打开
}
if(Helpers.IsWindowOpen(“CustomWindowName”))
{
//有一个名为CustomWindowName open的MyCustomWindowType窗口
}
是您搜索的吗
if (this.m_myWindow != null)
{
if (this.m_myWindow.IsActive) return;
}
this.m_myWindow = new MyWindow();
this.m_myWindow.Show();
如果您想要单例,请阅读以下内容:如果您需要在找到窗口时激活该窗口,可以使用以下代码:
//activate a window found
//T = Window
Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault();
wnd.Activate();
//激活找到的窗口
//T=窗口
Window wnd=Application.Current.Windows.OfType()。其中(w=>w.Name.Equals(nome)).FirstOrDefault();
wnd.Activate();
void pencereac(int-Ops)其中T:Window,new()
{
如果(!Application.Current.Windows.OfType().Any())//检查未打开,请打开它。
{
var风=新T();
交换机(Ops)
{
案例1:
wind.ShowDialog();
打破
案例0:
wind.Show();
打破
}
}
else Application.Current.Windows.OfType().First().Activate();//打开并激活它。
}
库兰·穆:
void Button_1_Click(object sender, RoutedEventArgs e)
{
pencereac<YourWindow>(1);
}
void按钮\u 1\u单击(对象发送器,路由目标)
{
铅笔(1);
}
下面是使用LINQ实现这一点的另一种方法
using System.Linq;
...
public static bool IsOpen(this Window window)
{
return Application.Current.Windows.Cast<Window>().Any(x => x == window);
}
public bool IsWindowOpen(string name=“”)其中T:Window
{
返回Application.Current.Windows.OfType().Any(w=>w.GetType().Name.Equals(Name));
}
如果您想检查第二个表单是否已打开,并避免在单击按钮时再次打开它,则此操作有效
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
{
{
您好,IsActive属性不工作。我认为它只检查窗口是否有焦点(我不确定),这是一个好的解决方案!谢谢但既然我找到了解决问题的另一种方法,我就不会使用它了。@guilhermes你找到了什么更简单的方法来解决你的问题?@estebro-我使用了一个模式弹出窗口。我的要求是避免用户与其他打开的窗口交互。因此,根据定义,模式弹出窗口可以做到这一点。有没有一种方法可以将它用于在另一个线程上运行的wpf窗口?如果是,有人能举个简单的例子吗?根据文档应用程序。Current.Windows
是一个列表,列出了所有已实例化(不一定打开)的窗口,这些窗口与@Ofstream只是出于兴趣而提供的类似解决方案,这段代码中是否存在内存泄漏,因为我们从未删除关闭的事件处理程序,或者将对象设置为null是否会删除所有事件处理程序?@user1我知道这很旧,但是是的;是的,它确实会造成内存泄漏。我目前正试图找到一种方法来解决托盘应用程序中的内存泄漏问题,该应用程序生成不同的窗口并在一个变量上同步这些窗口。@Joshetland您不能在关闭事件中删除窗口的事件处理程序吗?您可能会使用显式方法而不是匿名方法来执行此操作。我认为这会消除内存泄漏是的,但我还没有找到一个方法来做到这一点,当我使用的lamda广泛使用。感谢更新!ShowDialog()正是我所需要的!格式化您的代码,并解释它为什么工作以及它的作用。
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
{
{