Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道WPF窗口是否已打开_C#_Wpf_Window - Fatal编程技术网

C# 如何知道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() 它阻止用户打开任何其他窗口,就像模式弹出窗口一样。 使用此命

在WPF窗口中,如何知道它是否已打开

我的目标是一次只打开一个窗口实例

因此,我在父窗口中的伪代码是:

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
   {   
{