禁用窗口上的WPF事件

时间:2019-07-08 09:53:43

标签: c# .net wpf

是否有可能在禁用的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;
           }
       }          
    }
}

感谢您的想法/解决方案!

2 个答案:

答案 0 :(得分:0)

调用ShowDialog表示您要使窗口显示为 modal ,从而禁用其他窗口。

将此方法切换为Show,您还可以使用其他窗口。

请参阅this

答案 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;
    });
}