我正在使用ComboBox处理WPF窗口,并遇到了可怕的访问密钥问题。通过我的google-fu,我发现我可以使用以下代码将其关闭;
<Grid.Resources>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="RecognizesAccessKey" Value="False"/>
</Style>
</Grid.Resources>
这项工作相对较好,当选择一个项目时,它现在显示下划线,我不需要担心后面的代码中的任何.Replace(...)
调用。问题是它只适用于所选项目,所有其他项目都隐藏了下划线。
在下图中,我选择了AU-15003\SQLEXPRESS_2014
(最初隐藏了下划线),下拉列表关闭时显示下划线。然后我重新打开了下拉列表并且下划线保留了该项目。其他项目仍然没有下划线(SQLEXPRESS2008遵循相同的模式)。
我不知道为什么会这样,我似乎找不到任何可以关闭RecognizesAccessKey属性的地方。
答案 0 :(得分:1)
我不确定你要在这里完成什么,但我可以肯定地告诉你为什么针对ContentPresenter
的隐式样式往往不能按预期工作。
规则是模板(ControlTemplates
以及DataTemplates
)是应用隐式样式的边界,即在模板外部定义的隐式样式不会应用于其中的元素。该规则有一个例外 - 如果目标类型派生自Control
,则样式甚至会应用于模板中。您可以轻松检查ContentPresenter
是否来自Control
。此外,有问题的ContentPresenter
(显示ComboBox
下拉列表中的项目的人)位于ComboBoxItem
的模板中。“
现在我无法找到任何具体的内容,可以从您发布的代码中重现您的问题,但我可以建议您如何调整ContentPresenter
下拉列表中的ComboBox
- 您的最好的办法是提供自定义ComboBox.ItemTemplate
:
<ComboBox (...)>
<ComboBox.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding}" RecognizesAccessKey="False" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
如果您想要更通用的解决方案(类似于您的尝试),您可以创建一个隐式样式定位ComboBox
并以类似的方式设置ComboBox.ItemTemplate
属性:
<Grid.Resources>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<ContentPresenter Content="{Binding}" RecognizesAccessKey="False" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>