从 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
。该控件类型的作用类似于普通按钮,单击后不会有任何可见的后效。
我的 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
。该控件类型的作用类似于普通按钮,单击后不会有任何可见的后效。