C# 如何检查窗口是否已打开?重复窗口

C# 如何检查窗口是否已打开?重复窗口,c#,wpf,visual-studio,C#,Wpf,Visual Studio,我有一个打开窗口的按钮 如果再次按下按钮,将打开同一窗口的副本 info = new Info(); info.Owner = Window.GetWindow(this); info.Show(); 如何检查窗口是否已打开,并拒绝再次打开副本 我无法使用info.ShowDialog(),因为它禁用了主窗口 不起作用的解决方案: Info info = new Info(); if (!info.IsActive) { info = new Info(); info.Ow

我有一个打开窗口的按钮

如果再次按下按钮,将打开同一窗口的副本

info = new Info();
info.Owner = Window.GetWindow(this);
info.Show();
如何检查窗口是否已打开,并拒绝再次打开副本

我无法使用
info.ShowDialog()
,因为它禁用了
主窗口


不起作用的解决方案:

Info info = new Info();

if (!info.IsActive)
{
    info = new Info();
    info.Owner = Window.GetWindow(this);
    info.Show();
}


publicstaticboolswindowopen(stringname=“”)其中T:Window
{
返回字符串.IsNullOrEmpty(名称)
?Application.Current.Windows.OfType().Any()
:Application.Current.Windows.OfType().Any(w=>w.Name.Equals(Name));
}
私有无效按钮信息单击(对象发送者,路由目标)
{    
如果(!IsWindowOpen(“信息”))
{
信息=新信息();
info.Owner=Window.GetWindow(此);
info.Show();
}
}

您可以使用
.IsLoaded
字段或绑定
.ContentRendered
事件

编辑1- 窗口1:

public class Window1 : Window
{
    private Info info = null;
    private Boolean IsInfoOpened = false;

    protected void OpenInfo()
    {
        if (this.IsInfoOpened) return;
        this.info = new Info();
        this.info.ContentRendered += delegate { this.IsInfoOpened = true; };
        this.info.Closed += delegate { this.IsInfoOpened = false; }
        this.info.Show();
    }
}

您可以使用
.IsLoaded
字段或绑定
.ContentRendered
事件

编辑1- 窗口1:

public class Window1 : Window
{
    private Info info = null;
    private Boolean IsInfoOpened = false;

    protected void OpenInfo()
    {
        if (this.IsInfoOpened) return;
        this.info = new Info();
        this.info.ContentRendered += delegate { this.IsInfoOpened = true; };
        this.info.Closed += delegate { this.IsInfoOpened = false; }
        this.info.Show();
    }
}

明智的方法是只跟踪窗口实例,这样以后就不必再找到它了。添加一个字段:

    private Info infoWindow;
如果为空,那么您知道窗口还不存在,因此您需要创建它。使用Closed事件将变量设置回null。如果不为null,则需要确保恢复窗口。因此:

    private void button_Click(object sender, RoutedEventArgs e) {
        if (infoWindow == null) {
            infoWindow = new Info();
            infoWindow.Closed += (s, ea) => infoWindow = null;
            infoWindow.Owner = this;   // optional
            infoWindow.Show();
        }
        else {
            if (infoWindow.WindowState == WindowState.Minimized) {
                infoWindow.WindowState = WindowState.Normal;
            }
            infoWindow.Activate();
        }
    }
当包含按钮的窗口关闭时,您可能还希望自动关闭该窗口:

    private void Window_Closed(object sender, EventArgs e) {
        if (infoWindow != null) infoWindow.Close();
    }

明智的方法是只跟踪窗口实例,这样以后就不必再找到它了。添加一个字段:

    private Info infoWindow;
如果为空,那么您知道窗口还不存在,因此您需要创建它。使用Closed事件将变量设置回null。如果不为null,则需要确保恢复窗口。因此:

    private void button_Click(object sender, RoutedEventArgs e) {
        if (infoWindow == null) {
            infoWindow = new Info();
            infoWindow.Closed += (s, ea) => infoWindow = null;
            infoWindow.Owner = this;   // optional
            infoWindow.Show();
        }
        else {
            if (infoWindow.WindowState == WindowState.Minimized) {
                infoWindow.WindowState = WindowState.Normal;
            }
            infoWindow.Activate();
        }
    }
当包含按钮的窗口关闭时,您可能还希望自动关闭该窗口:

    private void Window_Closed(object sender, EventArgs e) {
        if (infoWindow != null) infoWindow.Close();
    }

仅当值不为null时创建表单。 如果表单已关闭,则使用FormClosed事件将值返回null

public static Info info;

if(info == null){
  info = new Info();
  info.Show();
}
在信息表单上关闭事件表单

 private void info_FormClosed(object sender, FormClosedEventArgs e)
 {
    MainForm1.info = null;
 }

它适用于我

仅当值不为null时创建表单。 如果表单已关闭,则使用FormClosed事件将值返回null

public static Info info;

if(info == null){
  info = new Info();
  info.Show();
}
在信息表单上关闭事件表单

 private void info_FormClosed(object sender, FormClosedEventArgs e)
 {
    MainForm1.info = null;
 }

它适合我

我尝试了多种不同的方式来处理(!info.IsLoaded),尽管按钮仍然会生成一个重复的窗口。这非常好用。我将Info和Boolean放在类的顶部,并将if语句放在按钮中。我以多种不同的方式尝试了if(!Info.IsLoaded),尽管按钮仍然会生成一个重复的窗口。这非常有效。我将Info和Boolean放在类的顶部,并将if语句放在按钮中。您将继续创建
Info
的新实例,并基于新实例进行检查。你应该在你的类级别声明你的
Info
窗口,并进行检查。你将继续创建
Info
的新实例,并基于新实例进行检查。你应该在你的类级别声明你的
Info
窗口,并检查它。这是WinForms的吗?我实际上使用的是WPF,但我会记住这一点。是的,它适用于windows窗体,但如果您搜索WPF的窗体关闭事件,它也会起作用。也许试试这是WinForms的?我实际上使用的是WPF,但我会记住这一点。是的,它适用于windows窗体,但如果您搜索WPF的窗体关闭事件,它也会起作用。也许试试这个,效果很好。虽然如果再次单击主窗口按钮,信息窗口会失去焦点,这是正确的功能,但@zaylau answer会将焦点保留在信息窗口上,我想在本例中使用该窗口。如果要将焦点保留在信息窗口上,则必须使用ShowDialog()。好吧,你已经驳回了。我猜你真正的意思是你想让它保持在主窗口上方,设置Owner属性。实际上你是对的,我把Owner属性放在了另一个解决方案上,这就是保持焦点的原因。你的答案是一样的。这很有效。虽然如果再次单击主窗口按钮,信息窗口会失去焦点,这是正确的功能,但@zaylau answer会将焦点保留在信息窗口上,我想在本例中使用该窗口。如果要将焦点保留在信息窗口上,则必须使用ShowDialog()。好吧,你已经驳回了。我猜你真正的意思是你想让它保持在主窗口上方,设置Owner属性。实际上你是对的,我把Owner属性放在了另一个解决方案上,这就是保持焦点的原因。你的回答是一样的。