Wpf 问题:在关闭事件时激活其他窗口
我有一些窗口,可以在单个应用程序中打开多个实例。 我在一个静态字典中跟踪它们 如果车窗处于活动状态,则按下退出按钮时必须关闭车窗。如果通过Wpf 问题:在关闭事件时激活其他窗口,wpf,Wpf,我有一些窗口,可以在单个应用程序中打开多个实例。 我在一个静态字典中跟踪它们 如果车窗处于活动状态,则按下退出按钮时必须关闭车窗。如果通过escape关闭窗口,我需要激活另一个窗口,如果有,则存储在字典中。我还需要考虑当前的Windows Z命令并激活它们中的大多数,但现在已经不重要了。 因此,当我打开一些窗口并尝试关闭它们时,按下escape我得到的结果是,在某个时刻,所有剩余的窗口都同时关闭 下面是代码示例: namespace WpfApplication1 { /// <s
escape
关闭窗口,我需要激活另一个窗口,如果有,则存储在字典中。我还需要考虑当前的Windows Z命令并激活它们中的大多数,但现在已经不重要了。
因此,当我打开一些窗口并尝试关闭它们时,按下escape
我得到的结果是,在某个时刻,所有剩余的窗口都同时关闭
下面是代码示例:
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private int _count;
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1.Run(this, ++_count);
}
}
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
private static Dictionary<int, Window1> _opened =
new Dictionary<int, Window1>();
private int _key;
public Window1()
{
InitializeComponent();
KeyDown += OnKeyDown;
}
private void OnKeyDown(object sender, KeyEventArgs ea)
{
if (ea.Key == Key.Escape)
{
Close();
}
}
public static void Run(Window owner, int key)
{
Window1 w = null;
if (_opened.TryGetValue(key, out w))
{
w.Activate();
}
else
{
w = new Window1{_key = key};
w.Closed += (s, e) =>
{
var win = s as Window1;
_opened.Remove(win._key);
if (_opened.Count > 0)
{
_opened.First().Value.Activate();
}
};
_opened.Add(key, w);
w.Show();
}
}
}
}
更新#2
这是另一个不那么优雅的解决方案,只是记录在案
...
_opened.Remove(win._key);
if (_opened.Count > 0)
{
// i suppose here is the error hidden
var w2 = _opened.First().Value;
w2.Dispatcher.BeginInvoke(new Action(() => w2.Activate()));
}
...
我发现的唯一方法是延迟下一个窗口激活,如下所示:
...
_opened.Remove(win._key);
if (_opened.Count > 0)
{
// i suppose here is the error hidden
var w2 = _opened.First().Value;
w2.Dispatcher.BeginInvoke(new Action(() => w2.Activate()));
}
...
任何其他建议将不胜感激!谢谢大家! 我试图重现您的问题,但没有成功,窗口一个接一个地关闭得很好。只有当属性设置为true时,才能尝试调用Close()方法 编辑我设法复制了您的问题 我找到的解决方案是在调用Close()之后,在KeyDown处理程序中设置e.Handled=true
我想问题是,在第一个窗口关闭之前,窗口一个接一个地处于活动状态,因此它们也收到了KeyDown事件触发。奇怪的是,这只发生在我的示例中,只发生在您打开的第一个窗口中。在您关闭所有这些项目并开始打开其他项目后,这将不会重现。尝试了我的示例项目,并在键关闭时选中“ea.Key==Key.Escape&&IsActive”,但没有任何帮助。所有的窗户仍然同时关闭你是对的。更准确地说,你是对的。首先,似乎“e.Handled=true”起作用。第二,这真的很奇怪,只在第一个窗口打开时才会发生。
...
_opened.Remove(win._key);
if (_opened.Count > 0)
{
// i suppose here is the error hidden
var w2 = _opened.First().Value;
w2.Dispatcher.BeginInvoke(new Action(() => w2.Activate()));
}
...