A fair portion of the time, the content of a FrameworkElement is text. Some elements, like TextBox and TextBlock make this obvious, by providing a Text property. The Text Property is of type String and it trivially easy to set in XAML.

[example]

  <TextBlock Text='This control is intended to show text' />

Other FrameworkElements are more flexible regarding their content. Take the ContentControls (CheckBox, Label, Button) for example. They expose the Content Property, not a Text property. Content, in this case, means a single child element. This child could be a single TextBlock or a complex nested hierarchy of children items.

[example]

    <Label Content='This control can contain text' />
    <Label>
      <Label.Content>
        <StackPanel Orientation='Horizontal'>
              
        <Image Source='geese.jpg' Width='100'/>
          <TextBlock Text='Or it can contain more complex UI' />
        </StackPanel>
        </Label.Content>
    </Label>
      <!--<TextBlock Content="This will not parse" />-->

WinForm developers are often surprised to learn the Label can work with complex content. The key thing to remember about Label in WPF it that its main purpose is NOT to show text. Rather, its prime mission is to enable 'accelerator-keys' for other controls in the XAML tree. For example, if you want to permit ALT-F to move your input cursor to the First Name TextBox. To do this you place a Label and a TextBox in your XAML. Use a binding to link the two together.

[example]
<Label Target='{Binding ElementName=firstNameTextBox}' Content='_First Name'/> <TextBox x:Name='firstNameTextBox' />

Because the Label is a Content control you can show icons, bullets or other interesting UI in the Label.