我只想在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次,我就可以打开窗口的许多实例。
由于
答案 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();
}