H. *_*lyn 18 c# wpf xaml wpf-controls
在WPF(甚至是Windows 8或8.1应用程序)中,您有三种方法可以在控件中添加文本.
Run元素内部的TextBlock元素
<TextBlock>
<Run>My text</Run>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)Textproperty作为TextBlock元素的属性
<TextBlock Text="My text" />
Run Code Online (Sandbox Code Playgroud)Textproperty作为元素内部的TextBlock元素
<TextBlock>
<TextBlock.Text>my text</TextBlock.Text>
</TextBlock>`
Run Code Online (Sandbox Code Playgroud)这三种方法有什么区别?为什么你必须使用Text一个TextBlock和Content一个ComboboxItem?
Xav*_*ier 31
具有Text属性的控件只能接受字符串,并以该控件处理的特定方式呈现.此类控件的示例是TextBlock和TextBox.
具有Content属性的控件可以具有object该属性的任何设置.这些控件通常将值转发给ContentPresenter上的Content属性.该ContentPresenter类文档有相关的块:
ContentPresenter使用以下逻辑来显示内容:
- 如果设置了ContentPresenter上的ContentTemplate属性,则ContentPresenter会将该DataTemplate应用于Content属性,并显示生成的UIElement及其子元素(如果有).有关DataTemplate对象的更多信息,请参阅数据模板概述.
- 如果设置了ContentPresenter上的ContentTemplateSelector属性,则ContentPresenter会将相应的DataTemplate应用于Content属性,并显示生成的UIElement及其子元素(如果有).
- 如果存在与Content类型关联的DataTemplate,则ContentPresenter将该DataTemplate应用于Content属性,并显示生成的UIElement及其子元素(如果有).
- 如果Content是UIElement对象,则显示UIElement.如果UIElement已经有父项,则会发生异常.
- 如果存在将Content类型转换为UIElement的TypeConverter,则ContentPresenter将使用该TypeConverter并显示生成的UIElement.
- 如果有一个TypeConverter将Content的类型转换为字符串,ContentPresenter将使用该TypeConverter并创建一个TextBlock来包含该字符串.将显示TextBlock.
- 如果内容是XmlElement,则InnerText属性的值将显示在TextBlock中.
- ContentPresenter在Content上调用ToString方法并创建一个TextBlock以包含ToString返回的字符串.将显示TextBlock.
对于TextBlock类,您可以选择设置Text属性或设置Inlines属性.设置Text将简单地呈现文本.设置Inlines(如果将内容放在xaml标记的正文中,则为默认设置)允许您设置文本格式.例如,你可以使用一个运行其fontWeight设置设为Bold做出了一定的单词或短语在句子内大胆.您可以使用LineBreak插入新行.您甚至可以使用InlineUIContainer在文本中插入自定义UI元素.从Inline类派生的任何内容都可以包含在此集合中.
TextBlock适用于格式化文本的简单位.如果您想要更强大的文档样式功能,可以查看FlowDocument,它由RichTextBox,FlowDocumentScrollViewer和FlowDocumentReader等控件使用.
至于<TextBlock Text="something" />和之间的区别<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>,实际上没有区别.这些只是两种不同的方式,您可以通过它们在xaml文件中设置属性.第二个版本通常仅在需要在setter中定义其他元素时使用.
关于“属性元素”的简短词
这只是对 Xaviers 很好的回答的补充说明。
其实两者没有太大区别:
<TextBlock Text="something" />
Run Code Online (Sandbox Code Playgroud)
和
<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>
Run Code Online (Sandbox Code Playgroud)
那是因为该Text属性的类型String是一个简单类型,可以像Text="something".
上面示例中的后一种语法称为“属性元素”。它通常用于将元素的属性设置为复杂类型。
例子:
<Button>
<Button.Content>
<Rectangle Height="20", Width="20", Fill="Black"/>
</Button.Content>
</Button>
Run Code Online (Sandbox Code Playgroud)
在此示例中,您可以不使用 直接设置“矩形” Button.Content,但对于其他示例,语法可用于设置复杂类型的属性。