众所周知,WPF中有两类控件。一类是内容控件,一类是其他。
内容控件,有一个属性叫Content
。典型的有ContentControl
,Button
,Label
。Content
非常的灵活,可以承载其他的控件。而且对于非控件或者是不能识别的,会直接ToString
然后显示。
所以我们有时候会直接把字符串绑定到Content
属性上。比如:
<Button Content="OK"/>
如果只是普通的这样使用,其实是没有问题的。但是一旦涉及到下划线,就会出现下划线变少的情况。比如:
<Button Content="O_______K"/>
这里面的下划线就会变少。
如果我们运行程序然后在Visual Tree中查看Button
的属性。会看到
最后一级的
TextBlock
的Text
属性内容为空,但是Inlines
的属性是有值的。展开Inlines
会看到里面是一个Run
。做过RichTextBox
相关的朋友可能对这个很熟悉。而这个Run
的DataContext
和Text
属性的值是不同的。DataContext
中的值是我们设置的值,但是Text
中的值却不是。为何会出现这个问题,暂时不知道。还没去研究源码。不过巨硬现在把WPF也开源了,等有时间了去研究一下。
解决方法就很简单啦。一般有
Content
属性的控件,都有ContentTemplate
属性。只用写一个模板,在里面指定用TextBlock
显示就好了。
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>