是否有可能在禁用的WPF窗口上处理事件? .ShowDialog()
从其他窗口禁用了主窗口。在我的应用程序中,一次仅启用一个窗口,我想提高可用性。如果用户单击了错误的(禁用的)主窗口,则应用程序应自动聚焦到启用的窗口。
我知道禁用表示窗口不响应任何事件,但是是否有诸如全局事件处理程序或某些特殊WPF事件之类的解决方案?
我尝试了PreviewMouseLeftButtonDown
事件,但是没有用。
// event called from some special/ global event on disabled window
private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if(App.Current.Windows.Count > 1)
{
foreach(Window w in App.Current.Windows)
{
if(w.IsEnabled)
{
w.Focus();
break;
}
}
}
}
感谢您的想法/解决方案!
答案 0 :(得分:0)
答案 1 :(得分:0)
谢谢您的提示,但是作为一项要求,我必须确保在打开另一个窗口时冻结主窗口,并且找到了解决方案:我已经冻结了,而不是使用.ShowDialog()
冻结了该窗口全部控制何时使用.Show()
打开新窗口。
private void DisableAllControls()
{
// parallel execution cause of many elements
Parallel.For(0, VisualTreeHelper.GetChildrenCount(this), index =>
{
(VisualTreeHelper.GetChild(this, index)
as UIElement).IsEnabled = false;
});
}
如果用户单击“冻结”主窗口,我还添加了MouseDownEvent
以使新窗口聚焦。 (将同时打开一个额外的窗口。)
private void FocusLastOpen_MouseDown(object sender, MouseEventArgs e)
{
if (App.Current.Windows.Count > 1)
{
foreach (Window w in App.Current.Windows)
{
if (w.IsEnabled && w.GetType() != typeof(MainWindow))
{
w.Focus();
}
}
}
}
要在另一个窗口关闭时重新激活主窗口的元素,我编写了一个静态方法,该方法将在ClosingEvent
上执行。
public static void EnableAllControls()
{
MainWindow obj = null;
foreach(Window w in App.Current.Windows)
{
if(w.GetType() == typeof(MainWindow))
{
obj = w as MainWindow;
break;
}
}
if(obj == null) return;
Parallel.For(0, VisualTreeHelper.GetChildrenCount(obj), index =>
{
(VisualTreeHelper.GetChild(obj, index)
as UIElement).IsEnabled = true;
});
}