单实例窗口WPF不工作

本文关键字:WPF 工作 窗口 实例 单实例 | 更新日期: 2023-09-27 18:19:25

我只想在WPF中有一个单独的Window实例。

我在窗口中的代码:

public static bool IsOpen { get; private set; }
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    IsOpen = true;
}
private void Window_Unloaded(object sender, RoutedEventArgs e)
{
    IsOpen = false;
}

我在open函数中的代码

if (MyWindow!= null)
{
    if (MyWindowName.IsOpen)
    {
        MyWindow.Activate();
    }
    else
    {
        MyWindow.Close();
        MyWindow= null;
    }
}
if (MyWindow!= null) return;
MyWindow= new MyWindowName();
MyWindow.Show();
MyWindow.Activate();

但是如果我快速点击3-5次,我就可以打开窗口的许多实例。

谢谢

单实例窗口WPF不工作

在您使用show命令打开窗口(然后将处理消息队列,允许处理其他单击)和触发窗口加载事件之间将有延迟。

一个非常快速和肮脏的修复方法是将IsOpen赋值移到show命令之前,您也可以在if中使用return来消除第二次检查的需要。

if (MyWindow!= null)
{
    if (MyWindowName.IsOpen)
    {
        MyWindow.Activate();
        return;
    }
    else
    {
        MyWindow.Close();
        MyWindow= null;
    }
}
MyWindow= new MyWindowName();
MyWindow.IsOpen = true;
MyWindow.Show();
MyWindow.Activate();

显然您遇到了竞争条件。考虑到您必须利用Window的事件模型,这并不奇怪。只需在声明MyWindow的同一个类中声明object,如下所示:

private object _lockObj = new object();

然后在做你的工作时,这样做:

lock (_lockObj)
{
    if (MyWindow!= null)
    {
        if (MyWindowName.IsOpen)
        {
            MyWindow.Activate();
        }
        else
        {
            MyWindow.Close();
            MyWindow= null;
        }
    }
    if (MyWindow!= null) return;
    MyWindow= new MyWindowName();
    MyWindow.Show();
    MyWindow.Activate();
}

这个简单的代码怎么样?

  Window2 win;
        object locker = new Object();
        private void OnShow(object sender, RoutedEventArgs e)
        {
            lock (locker)
            {
                if (win == null)
                    win = new Window2();
                win.Show();
            }
        }
        private void OnHide(object sender, RoutedEventArgs e)
        {
            if (win != null)
                win.Hide();
        }