【发布时间】:2016-02-21 05:15:34
【问题描述】:
我的应用程序中有一个菜单可以直接从外部绑定的字符串列表 (ItemsSource = Settings.RecentlyLoadedFiles) 中获取其内容。这些字符串是文件名,当用户单击菜单中的某个项目时,将加载该文件。
<ui:SplitButton
Grid.Column="0"
Command="{Binding LoadLogCommand}" ToolTip="Load log" ToolTipService.ShowOnDisabled="True"
Focusable="False"
ItemsSource="{Binding Settings.RecentlyLoadedFiles}"
MenuItem.Click="SplitButton_Click">
<ui:SplitButton.Icon>
<ui:MenuIconImage Source="/Images/folder_open.png"/>
</ui:SplitButton.Icon>
</ui:SplitButton>
现在文件名中可以很容易地包含下划线,并且不会显示,因为 WPF 认为它可能是加速键。它不是。但是我怎么能告诉菜单呢?
没有简单的方法将这些下划线加倍以显示其中一个。该列表来自与此类事情无关的来源。
我是否需要编写一个自定义转换器将该列表转换为带有双下划线的字符串列表才能禁用该功能?
或者我是否需要从某处复制菜单项的整个模板,以便在其中某处以不同方式设置一个特定属性?
难道没有一些附加属性或任何东西可以传播到进行解释的地方吗?
【问题讨论】:
-
一点解释:
MenuItem在其ControlTemplate中包含一个ContentPresenter,而RecognizesAccessKey设置为true。我的观察是它所做的是检测内容是什么,如果它是一个包含_的字符串,那么它将内容包装在AccessText元素中,AccessKey设置为下划线后面的字符。我不知道有任何附加属性会影响这一点。在ContentPresenter之后将RecognizesAccessKey更改为false 没有效果。下面给出的答案是一个可能的解决方案。 -
@LonelyPixel - 您必须覆盖 MenuItem 的默认模板并将
RecongnizesAccessKey设置为False,它应该可以工作。也许您可以将 MenuItem 的默认样式放在菜单资源中,这样您就不必显式覆盖所有菜单项。