在WPF中运行与内容与文本

H. *_*lyn 18 c# wpf xaml wpf-controls

在WPF(甚至是Windows 8或8.1应用程序)中,您有三种方法可以在控件中添加文本.

  1. Run元素内部的TextBlock元素

    <TextBlock>
        <Run>My text</Run>
    </TextBlock>
    
    Run Code Online (Sandbox Code Playgroud)
  2. Textproperty作为TextBlock元素的属性

    <TextBlock Text="My text" />
    
    Run Code Online (Sandbox Code Playgroud)
  3. Textproperty作为元素内部的TextBlock元素

    <TextBlock>
        <TextBlock.Text>my text</TextBlock.Text>
    </TextBlock>`
    
    Run Code Online (Sandbox Code Playgroud)

这三种方法有什么区别?为什么你必须使用Text一个TextBlockContent一个ComboboxItem

Xav*_*ier 31

具有Text属性的控件只能接受字符串,并以该控件处理的特定方式呈现.此类控件的示例TextBlockTextBox.

具有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,FlowDocumentScrollViewerFlowDocumentReader控件使用.

至于<TextBlock Text="something" />和之间的区别<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>,实际上没有区别.这些只是两种不同的方式,您可以通过它们在xaml文件中设置属性.第二个版本通常仅在需要在setter中定义其他元素时使用.


Mar*_*tin 5

关于“属性元素”的简短词

这只是对 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,但对于其他示例,语法可用于设置复杂类型的属性。