WPF列表框。在字符串中跳过下划线符号

时间:2011-01-05 07:40:07

标签: c# wpf

我有一些WPF ListBox,它动态填充项目。像这样:

ListBox.Items.Add
(new ListBoxItem { Content = new CheckBox { IsChecked = true, Content = "string_string"} );

问题在于复选框内容。它在GUI上显示为“stringstring”...... 如何逃避“_”符号? (我动态地获取字符串)

4 个答案:

答案 0 :(得分:28)

您可以在TextBlock中添加文本并将该TextBlock放入Chekbox中,TextBlock不支持_助记符。这就是我的意思,在xaml中,但您可以轻松地将其转换为代码:

<CheckBox IsChecked="True">
    <TextBlock>string_string</TextBlock>
</CheckBox>

答案 1 :(得分:14)

CheckBox的默认模板包含一个ContentPresenter,其 RecognizesAccessKey 设置为true。如果内容是字符串(在您的情况下),则ContentPresenter会创建 AccessText 元素以显示文本。该元素隐藏下划线直到按下Alt键,因为它会将其视为助记符。您可以重新尝试CheckBox,使其ContentPresenter的RecognizesAccessKey为false或更好,但只提供DataTemplate作为包含TextBlock的ContentTemplate。如果您不确定内容是否为字符串,则可以设置ContentTemplateSelector,并在代码中提供仅在项目为字符串时包含TextBlock的DataTemplate。 e.g。

<ListBox xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <ListBox.Resources>
        <DataTemplate DataType="sys:String" x:Key="stringTemplate">
            <TextBlock Text="{Binding}" />
        </DataTemplate>
        <Style TargetType="CheckBox">
            <Setter Property="ContentTemplate" Value="{StaticResource stringTemplate}" />
        </Style>
    </ListBox.Resources>
    <ListBoxItem>
        <CheckBox Content="A_B" ContentTemplate="{StaticResource stringTemplate}"/>
        <!-- Or use the implicit style to set the ContentTemplate -->
        <CheckBox Content="A_B" />
    </ListBoxItem>
</ListBox>

答案 2 :(得分:7)

使用双下划线string__string,因为在WPF中,_是助记符。

更好的是,只需在xaml中解决此问题,并在视图模型(或代码隐藏)中创建一个集合。

答案 3 :(得分:0)

我在DataGrid中遇到了同样的问题。与AndrewS相似,我为TextBlock添加了一种样式,但未使用DataTemplate或ContentTemplate。这样,可以应用ColumnHeaderStyle中的setter :)但是,此解决方案仅适用于单个下划线,例如。 “ a_b”,但不适用于“ a__b”。

<DataGrid>
    <DataGrid.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Text" Value="{Binding}"/>
        </Style>
    </DataGrid.Resources>

    <DataGrid.ColumnHeaderStyle>
        <!-- my setters here do not get overridden -->
    </DataGrid.ColumnHeaderStyle>
</DataGrid>