Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 防止在飞出IsOpen=false时焦点切换到主窗体;_Wpf_Xaml_Mahapps.metro - Fatal编程技术网

Wpf 防止在飞出IsOpen=false时焦点切换到主窗体;

Wpf 防止在飞出IsOpen=false时焦点切换到主窗体;,wpf,xaml,mahapps.metro,Wpf,Xaml,Mahapps.metro,我有一辆地铁。它有一个弹出按钮。弹出按钮有一个按钮。按下弹出按钮时,将显示新的MetroWindow,弹出按钮将被取消 发生的情况是: 用户按下弹出按钮 按下按钮将打开一个新的非模态形状,并将弹出按钮的等参线设置为false 非模态形式在所有事物之上打开 弹出按钮关闭 主窗体在弹出按钮关闭后获得焦点-隐藏非模态窗体 我希望在弹出按钮关闭时,不会将焦点更改为主窗体 我有一个可行的方法,但它有点滞后,因为它必须等待弹出动画完成 有更好的办法吗?我不想使新窗口成为模态窗口或始终处于顶部 pri

我有一辆地铁。它有一个弹出按钮。弹出按钮有一个按钮。按下弹出按钮时,将显示新的MetroWindow,弹出按钮将被取消

发生的情况是:

  • 用户按下弹出按钮
  • 按下按钮将打开一个新的非模态形状,并将弹出按钮的等参线设置为false
  • 非模态形式在所有事物之上打开
  • 弹出按钮关闭
  • 主窗体在弹出按钮关闭后获得焦点-隐藏非模态窗体
  • 我希望在弹出按钮关闭时,不会将焦点更改为主窗体

    我有一个可行的方法,但它有点滞后,因为它必须等待弹出动画完成

    有更好的办法吗?我不想使新窗口成为模态窗口或始终处于顶部

        private void SearchResultClose(object sender, RoutedEventArgs e)
        {
            m_EvtResultClosed.Set();
        }
    
        private void SearchResultOpenChange(object sender, RoutedEventArgs e)
        {
            if (foSearchResult.IsOpen)
            {
                m_EvtResultClosed.Reset();
            }
        }
    


    请参见MahApps的Flyout.cs中的函数
    IsOpenedChanged
    ,我们可以看到它在关闭时调用Focus(),无论其是否为动画。这也是一条评论:

     // focus the Flyout itself to avoid nasty FocusVisual painting (it's visible until the Flyout is closed)
    
    但我不知道它究竟想解决什么问题

    最简单的方法是将Focusable=“False”添加到弹出按钮中,如下所示:

    <controls:Flyout Focusable="False" Position="Top" Header="" x:Name="foSearchResult"Height="275" ClosingFinished="SearchResultClose" IsOpenChanged="SearchResultOpenChange">
    
    
    

    它在这里工作得很好,我无法说出源代码中评论的任何令人讨厌的焦点视觉绘制。

    默认情况下,当弹出按钮打开时,它会为自己窃取焦点,或者如果
    Focusable==false
    ,则为其中的某些控件,甚至是关闭按钮窃取焦点。在任何情况下,焦点都不会恢复到上一个元素

    因此,仅仅设置
    Focusable=“False”
    可能无法解决问题

    相反,弹出按钮提供了
    allowDocument
    属性来抑制此行为:

    <controls:Flyout AllowFocusElement="False" ... >
    

    太棒了!非常感谢。因此,我删除了所有丑陋的信号代码。
     // focus the Flyout itself to avoid nasty FocusVisual painting (it's visible until the Flyout is closed)
    
    <controls:Flyout Focusable="False" Position="Top" Header="" x:Name="foSearchResult"Height="275" ClosingFinished="SearchResultClose" IsOpenChanged="SearchResultOpenChange">
    
    <controls:Flyout AllowFocusElement="False" ... >