我有一些WPF ListBox,它动态填充项目。像这样:
ListBox.Items.Add
(new ListBoxItem { Content = new CheckBox { IsChecked = true, Content = "string_string"} );
问题在于复选框内容。它在GUI上显示为“stringstring”...... 如何逃避“_”符号? (我动态地获取字符串)
答案 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>