如何检查窗口是否已打开?重复的窗户

本文关键字:窗户 是否 何检查 检查 窗口 | 更新日期: 2023-09-27 18:06:36

我有一个打开窗口的按钮。

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

info = new Info();
info.Owner = Window.GetWindow(this);
info.Show();

如何检查窗口是否已经打开,并拒绝再次打开副本?

我不能使用info.ShowDialog(),因为它禁用了Main Window


不工作的解决方案:

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

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

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));
}
private void buttonInfo_Click(object sender, RoutedEventArgs e)
{    
    if (!IsWindowOpen<Window>("Info"))
    {
        Info info = new Info();
        info.Owner = Window.GetWindow(this);
        info.Show();
    }
}

如何检查窗口是否已打开?重复的窗户

仅在value不为空时创建表单。如果窗体已关闭,则使用FormClosed事件将该值放回null。

public static Info info;
if(info == null){
  info = new Info();
  info.Show();
}

把一个事件表单放在info表单上

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

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

    private Info infoWindow;

如果它是空的,那么你知道这个窗口还不存在,所以你想要创建它。使用Closed事件将变量设置回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();
    }

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

编辑1 -

Window1:

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();
    }
}