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