3

我只想在 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 次,我可以打开许多窗口实例。

谢谢

4

3 回答 3

1

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

一个非常快速和肮脏的解决方法是将 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();
于 2013-06-20T13:21:45.313 回答
0

这个简单的代码怎么样。

  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();
        }
于 2013-06-20T14:21:05.913 回答
0

显然,您遇到了比赛条件。考虑到您必须利用Window. 只需在声明object的同一个类MyWindow中声明一个,如下所示:

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();
}
于 2013-06-20T13:21:30.710 回答