无法为ComboBox下拉列表禁用RecognizesAccessKey属性

时间:2016-07-05 01:40:08

标签: c# wpf

我正在使用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属性的地方。

enter image description here

1 个答案:

答案 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>