从 WPF 中的 RibbonMenuItem 移除焦点

Remove focus from RibbonMenuItem in WPF

我的 WPF 应用程序中有一个简单的功能区,其中包含 RibbonGroup 和 RibbonMenuButton。单击此按钮后我想删除焦点。现在我必须双击或单击其他内容才能失去焦点。

<Custom:Ribbon Name="RibbonMenu" Focusable="True" Background="WhiteSmoke" HorizontalAlignment="Stretch" VerticalAlignment="Top" Loaded="RibbonLoaded" Grid.Row="0" Grid.ColumnSpan="2">
        <Custom:RibbonTab Name="home" Header="Home" KeyTip="H" Focusable="True" >
            <Custom:RibbonGroup Focusable="True" x:Name="utilsGroup" Header="Utils">
                <Custom:RibbonMenuButton x:Name="btUtils1" PreviewMouseLeftButtonDown="btUtils1_MouseLeftButtonDown" Label="Utility no 1" LargeImageSource="Resources/utils.png"/>
            </Custom:RibbonGroup>
        </Custom:RibbonTab>
</Custom:Ribbon>

还有我的代码隐藏:

private void btUtils1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){
       home.Focus();
}

根本不起作用。我在寻找解决方案,但似乎网络上的任何东西都可以帮助我。有什么建议吗?

如果没有很好的 Minimal, Complete, and Verifiable example,尤其是对您实际希望代码做什么的更准确的解释——即清楚准确地说明代码现在做什么,以及您希望它做什么— 很难确定您要完成什么。

就是说,在您提供的示例中,您有一个 RibbonMenuButton,单击它会打开一个下拉菜单,该下拉菜单一直保持打开状态,直到鼠标捕获丢失(即用户使用鼠标或键盘将注意力转移到别处)。

如果您专门尝试使此下拉菜单在单击时消失,您可以通过将 IsDropDownOpen 属性 设置为 false 来实现。请注意,您必须在所有输入处理完成后执行此操作,因为是输入本身导致下拉列表打开。为此,您可以使用 Dispatcher.InvokeAsync()。例如:

private void btUtils1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Dispatcher.InvokeAsync(() => btUtils1.IsDropDownOpen = false);
}


也就是说,你 确定 你真的想要 RibbonMenuButton 吗?如果您不希望控件保持打开状态或因单击而受到明显影响,也许您真正想要的是 RibbonButton。该控件类型的作用类似于普通按钮,单击后不会有任何可见的后效。