单实例窗口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次,我就可以打开窗口的许多实例。
谢谢
在您使用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();
}