在WPF中运行与内容与文本

时间:2015-03-28 12:02:53

标签: c# wpf xaml wpf-controls

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

    {li>

    Run元素<{1}}元素

    TextBlock
  1. <TextBlock> <Run>My text</Run> </TextBlock> 属性作为Text元素的属性

    TextBlock
  2. <TextBlock Text="My text" /> 属性作为Text元素

    中的元素
    TextBlock
  3. 这三种方法有什么区别?为什么您必须<TextBlock> <TextBlock.Text>my text</TextBlock.Text> </TextBlock>` 使用TextTextBlock使用Content

2 个答案:

答案 0 :(得分:26)

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

具有Content属性的控件实际上可以为该属性设置任何object。这些控件通常会将值转发给Content上的ContentPresenter属性。 ContentPresenter Class文档有相关的块:

  

ContentPresenter使用以下逻辑显示内容:

     
      
  • 如果设置了ContentPresenter上的ContentTemplate属性,则ContentPresenter会将该DataTemplate应用于Content属性,并显示生成的UIElement及其子元素(如果有)。有关DataTemplate对象的更多信息,请参阅数据模板概述。
  •   
  • 如果设置了ContentPresenter上的ContentTemplateSelector属性,则ContentPresenter会将相应的DataTemplate应用于Content属性,并显示生成的UIElement及其子元素(如果有)。
  •   
  • 如果存在与Content类型相关联的DataTemplate,则ContentPresenter会将该DataTemplate应用于Content属性,并显示生成的UIElement及其子元素(如果有)。
  •   
  • 如果Content是UIElement对象,则显示UIElement。如果UIElement已经有父项,则会发生异常。
  •   
  • 如果有一个将内容类型转换为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标记的正文中,则是默认设置)允许您格式化文本。例如,您可以使用RunFontWeight设置为Bold,以便在句子中使某个单词或短语加粗。您可以使用LineBreak插入新行。您甚至可以使用InlineUIContainer在文本中插入自定义UI元素。任何派生自Inline类的东西都可以进入这个集合。

TextBlock适用于格式化文本的简单位。如果您想要更强大的文档样式功能,可以查看FlowDocumentRichTextBoxFlowDocumentScrollViewerFlowDocumentReader等控件使用这些功能。

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

答案 1 :(得分:4)

关于'属性元素'的简短说明

这只是对泽维尔很好的回答的补充说明。

实际上之间没有太大区别:

<TextBlock Text="something" />

<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>

这是因为Text属性属于String类型,这是一种简单类型,可以像Text="something"一样直接设置。

上面示例中的后一种语法称为“属性元素”。 它通常在将元素的属性设置为复杂类型时使用。

示例:

<Button>
  <Button.Content>
     <Rectangle Height="20", Width="20", Fill="Black"/>
  </Button.Content>
</Button>

在此示例中,您可以直接设置“矩形”而不使用Button.Content,但对于其他示例,语法可用于设置复杂类型的属性。