单实例窗口WPF无法正常工作

时间:2013-06-20 13:16:40

标签: c# .net wpf

我只想在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;
}

我在开放功能中的代码

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

由于

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();
}

答案 2 :(得分: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();
        }