Delen via


Overzicht van Stroomdocument

Stroomdocumenten zijn ontworpen om de weergave en leesbaarheid te optimaliseren. In plaats van op één vooraf gedefinieerde indeling te worden ingesteld, passen stroomdocumenten hun inhoud dynamisch aan en herstromen op basis van runtimevariabelen, zoals venstergrootte, apparaatresolutie en optionele gebruikersvoorkeuren. Daarnaast bieden stroomdocumenten geavanceerde documentfuncties, zoals paginering en kolommen. In dit onderwerp vindt u een overzicht van stroomdocumenten en hoe u deze kunt maken.

Wat is een stroomdocument?

Een stroomdocument is ontworpen om inhoud opnieuw te laten stromen, afhankelijk van de grootte van het venster, de apparaatresolutie en andere omgevingsvariabelen. Daarnaast hebben stroomdocumenten een aantal ingebouwde functies, waaronder zoeken, weergavemodi die de leesbaarheid optimaliseren en de mogelijkheid om de grootte en het uiterlijk van lettertypen te wijzigen. Flow-documenten worden het beste gebruikt wanneer gemakkelijk lezen het primaire scenario voor documentgebruik is. Vaste documenten zijn daarentegen ontworpen voor een statische presentatie. Vaste documenten zijn handig wanneer betrouwbaarheid van de broninhoud essentieel is. Zie Documenten in WPF voor meer informatie over verschillende typen documenten.

In de volgende afbeelding ziet u een voorbeeld van een stroomdocument dat in verschillende vensters van verschillende grootten wordt weergegeven. Naarmate het weergavegebied verandert, wordt de inhoud opnieuw aangepast om optimaal gebruik te maken van de beschikbare ruimte.

Herindeling van documentinhoud

Zoals u in de bovenstaande afbeelding ziet, kan stroominhoud veel onderdelen bevatten, waaronder alinea's, lijsten, afbeeldingen en meer. Deze onderdelen komen overeen met elementen in markeringen en objecten in procedurele code. Deze klassen worden verderop in de sectie Gerelateerde stroomklassen van dit overzicht uitgebreid besproken. Hier volgt nu een eenvoudig codevoorbeeld waarmee een stroomdocument wordt gemaakt dat bestaat uit een alinea met vetgedrukte tekst en een lijst.

<!-- This simple flow document includes a paragraph with some
     bold text in it and a list. -->
<FlowDocumentReader xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <FlowDocument>
    <Paragraph>
      <Bold>Some bold text in the paragraph.</Bold>
      Some text that is not bold.
    </Paragraph>

    <List>
      <ListItem>
        <Paragraph>ListItem 1</Paragraph>
      </ListItem>
      <ListItem>
        <Paragraph>ListItem 2</Paragraph>
      </ListItem>
      <ListItem>
        <Paragraph>ListItem 3</Paragraph>
      </ListItem>
    </List>

  </FlowDocument>
</FlowDocumentReader>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace SDKSample
{
    public partial class SimpleFlowExample : Page
    {
        public SimpleFlowExample()
        {

            Paragraph myParagraph = new Paragraph();

            // Add some Bold text to the paragraph
            myParagraph.Inlines.Add(new Bold(new Run("Some bold text in the paragraph.")));

            // Add some plain text to the paragraph
            myParagraph.Inlines.Add(new Run(" Some text that is not bold."));

            // Create a List and populate with three list items.
            List myList = new List();

            // First create paragraphs to go into the list item.
            Paragraph paragraphListItem1 = new Paragraph(new Run("ListItem 1"));
            Paragraph paragraphListItem2 = new Paragraph(new Run("ListItem 2"));
            Paragraph paragraphListItem3 = new Paragraph(new Run("ListItem 3"));

            // Add ListItems with paragraphs in them.
            myList.ListItems.Add(new ListItem(paragraphListItem1));
            myList.ListItems.Add(new ListItem(paragraphListItem2));
            myList.ListItems.Add(new ListItem(paragraphListItem3));

            // Create a FlowDocument with the paragraph and list.
            FlowDocument myFlowDocument = new FlowDocument();
            myFlowDocument.Blocks.Add(myParagraph);
            myFlowDocument.Blocks.Add(myList);

            // Add the FlowDocument to a FlowDocumentReader Control
            FlowDocumentReader myFlowDocumentReader = new FlowDocumentReader();
            myFlowDocumentReader.Document = myFlowDocument;

            this.Content = myFlowDocumentReader;
        }
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents

Namespace SDKSample
    Partial Public Class SimpleFlowExample
        Inherits Page
        Public Sub New()

            Dim myParagraph As New Paragraph()

            ' Add some Bold text to the paragraph
            myParagraph.Inlines.Add(New Bold(New Run("Some bold text in the paragraph.")))

            ' Add some plain text to the paragraph
            myParagraph.Inlines.Add(New Run(" Some text that is not bold."))

            ' Create a List and populate with three list items.
            Dim myList As New List()

            ' First create paragraphs to go into the list item.
            Dim paragraphListItem1 As New Paragraph(New Run("ListItem 1"))
            Dim paragraphListItem2 As New Paragraph(New Run("ListItem 2"))
            Dim paragraphListItem3 As New Paragraph(New Run("ListItem 3"))

            ' Add ListItems with paragraphs in them.
            myList.ListItems.Add(New ListItem(paragraphListItem1))
            myList.ListItems.Add(New ListItem(paragraphListItem2))
            myList.ListItems.Add(New ListItem(paragraphListItem3))

            ' Create a FlowDocument with the paragraph and list.
            Dim myFlowDocument As New FlowDocument()
            myFlowDocument.Blocks.Add(myParagraph)
            myFlowDocument.Blocks.Add(myList)

            ' Add the FlowDocument to a FlowDocumentReader Control
            Dim myFlowDocumentReader As New FlowDocumentReader()
            myFlowDocumentReader.Document = myFlowDocument

            Me.Content = myFlowDocumentReader
        End Sub
    End Class
End Namespace

In de onderstaande afbeelding ziet u hoe dit codefragment eruitziet.

Schermopname: voorbeeld van een Rendered FlowDocument

In dit voorbeeld wordt het FlowDocumentReader besturingselement gebruikt om de stroominhoud te hosten. Zie Flowdocumenttypen voor meer informatie over controls voor het hosten van flowinhoud. Paragraph, List, ListItemen Bold elementen worden gebruikt om inhoudsopmaak te beheren, op basis van hun volgorde in markeringen. Het element beslaat bijvoorbeeld Bold slechts een deel van de tekst in de alinea. Hierdoor wordt alleen dat deel van de tekst vetgedrukt. Als u HTML hebt gebruikt, is dit voor u bekend.

Zoals is gemarkeerd in de bovenstaande afbeelding, zijn er verschillende functies ingebouwd in Stroomdocumenten:

  • Zoeken: Hiermee kan de gebruiker een zoekopdracht in volledige tekst van een heel document uitvoeren.

  • Weergavemodus: De gebruiker kan de gewenste weergavemodus selecteren, waaronder een weergavemodus met één pagina (pagina-op-een-tijd), een weergavemodus met twee pagina's tegelijk (leesindeling voor boeken) en een continue weergavemodus (bodemloos). Zie FlowDocumentReaderViewingModevoor meer informatie over deze weergavemodi.

  • Besturingselementen voor paginanavigatie: als de weergavemodus van het document pagina's gebruikt, bevatten de besturingselementen voor paginanavigatie een knop om naar de volgende pagina (de pijl-omlaag) of vorige pagina (de pijl-omhoog) te gaan, evenals indicatoren voor het huidige paginanummer en het totale aantal pagina's. U kunt ook door pagina's bladeren met behulp van de pijltoetsen op het toetsenbord.

  • Zoom: Met de zoombesturingselementen kan de gebruiker het zoomniveau vergroten of verkleinen door respectievelijk op de plus- of minknoppen te klikken. De zoombesturingselementen bevatten ook een schuifregelaar voor het aanpassen van het zoomniveau. Zie Zoom voor meer informatie.

Deze functies kunnen worden gewijzigd op basis van het besturingselement dat wordt gebruikt om de stroominhoud te hosten. In de volgende sectie worden de verschillende besturingselementen beschreven.

Stroomdocumenttypen

Weergave van flowdocumentinhoud en hoe deze eruitziet hangt af van het object dat wordt gebruikt om de flowinhoud te bevatten. Er zijn vier besturingselementen die ondersteuning bieden voor het weergeven van stroominhoud: FlowDocumentReader, FlowDocumentPageViewer, RichTextBoxen FlowDocumentScrollViewer. Deze besturingselementen worden hieronder kort beschreven.

Opmerking

FlowDocument is vereist voor het rechtstreeks hosten van stroominhoud, zodat al deze weergavebesturingselementen een FlowDocument verbruiken om het hosten van stroominhoud in te schakelen.

FlowDocumentReader

FlowDocumentReader bevat functies waarmee de gebruiker dynamisch kan kiezen tussen verschillende weergavemodi, waaronder een weergavemodus met één pagina (pagina-op-een-tijd), een weergavemodus met twee pagina's tegelijk (leesindeling voor boeken) en een doorlopende (ondersteloze) weergavemodus. Zie FlowDocumentReaderViewingModevoor meer informatie over deze weergavemodi. Als u niet de mogelijkheid nodig hebt om dynamisch te schakelen tussen verschillende weergavemodi, bieden FlowDocumentPageViewer en FlowDocumentScrollViewer lichtere stroominhoudweergaven die vastzitten in een bepaalde weergavemodus.

FlowDocumentPageViewer en FlowDocumentScrollViewer

FlowDocumentPageViewer toont inhoud in de weergavemodus voor pagina's tegelijk, terwijl FlowDocumentScrollViewer inhoud weergeeft in de modus voor doorlopend schuiven. Zowel FlowDocumentPageViewer als FlowDocumentScrollViewer zijn vastgemaakt aan een bepaalde weergavemodus. Vergelijk met FlowDocumentReader, dat functies bevat waarmee de gebruiker dynamisch kan kiezen tussen verschillende weergavemodi (zoals voorzien door de FlowDocumentReaderViewingMode-opsomming), maar wel meer middelen vergt dan FlowDocumentPageViewer of FlowDocumentScrollViewer.

Standaard wordt er altijd een verticale schuifbalk weergegeven en wordt een horizontale schuifbalk zo nodig zichtbaar. De standaardgebruikersinterface voor FlowDocumentScrollViewer bevat geen werkbalk; De eigenschap IsToolBarVisible kan echter worden gebruikt om een ingebouwde werkbalk in te schakelen.

RichTextBox

U gebruikt een RichTextBox optie als u de gebruiker wilt toestaan stroominhoud te bewerken. Als u bijvoorbeeld een editor wilt maken waarmee een gebruiker zaken zoals tabellen, cursief en vetgedrukt, enzovoort kan bewerken, gebruikt u een RichTextBox. Zie RichTextBox-overzicht voor meer informatie.

Opmerking

Stroominhoud binnen een RichTextBox gedraagt zich niet precies zoals stroominhoud in andere besturingselementen. Er zijn bijvoorbeeld geen kolommen in een RichTextBox en dus geen gedrag voor automatisch herschalen. Bovendien zijn de doorgaans ingebouwde functies van stroominhoud, zoals zoeken, weergavemodus, paginanavigatie en zoom, niet beschikbaar in een RichTextBox.

Flow-inhoud creëren

Stroominhoud kan complex zijn, bestaande uit verschillende elementen, waaronder tekst, afbeeldingen, tabellen en zelfs UIElement afgeleide klassen zoals besturingselementen. Als u wilt weten hoe u complexe stroominhoud maakt, zijn de volgende punten essentieel:

  • Stroomgerelateerde klassen: elke klasse die wordt gebruikt in stroominhoud heeft een specifiek doel. Daarnaast helpt de hiërarchische relatie tussen stroomklassen u te begrijpen hoe ze worden gebruikt. Klassen die zijn afgeleid van de Block klasse worden bijvoorbeeld gebruikt om andere objecten te bevatten, terwijl klassen die zijn afgeleid van Inline objecten bevatten die worden weergegeven.

  • Inhoudsschema: Een stroomdocument kan een aanzienlijk aantal geneste elementen vereisen. In het inhoudsschema worden mogelijke bovenliggende/onderliggende relaties tussen elementen opgegeven.

In de volgende secties vindt u meer informatie over elk van deze gebieden.

In het onderstaande diagram ziet u de objecten die het meest worden gebruikt met stroominhoud:

Diagram: Klassehiërarchie van stroominhoudselementen

Voor de doeleinden van stroominhoud zijn er twee belangrijke categorieën:

  1. Van blokken afgeleide klassen: ook wel 'Blokinhoudselementen' of 'Blokelementen' genoemd. Elementen die overnemen van Block , kunnen worden gebruikt om elementen onder een gemeenschappelijke bovenliggende groep te groeperen of om algemene kenmerken toe te passen op een groep.

  2. Inline-afgeleide klassen: ook wel 'Inline-inhoudselementen' of gewoon 'Inline-elementen' genoemd. Elementen die erven van Inline bevinden zich in een blok-element of een ander inline-element. Inline-elementen worden vaak gebruikt als de directe container met inhoud die op het scherm wordt weergegeven. Bijvoorbeeld, een Paragraph (blokelement) kan een Run (inline-element) bevatten, maar Run bevat daadwerkelijk de tekst die op het scherm wordt weergegeven.

Elke klas in deze twee categorieën wordt hieronder kort beschreven.

Blok-afgeleide klassen

alinea

Paragraph wordt meestal gebruikt om inhoud in een alinea te groeperen. Het eenvoudigste en meest voorkomende gebruik van Alinea is het maken van een alinea met tekst.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Paragraph>
    Some paragraph text.
  </Paragraph>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace SDKSample
{
    public partial class ParagraphExample : Page
    {
        public ParagraphExample()
        {

            // Create paragraph with some text.
            Paragraph myParagraph = new Paragraph();
            myParagraph.Inlines.Add(new Run("Some paragraph text."));

            // Create a FlowDocument and add the paragraph to it.
            FlowDocument myFlowDocument = new FlowDocument();
            myFlowDocument.Blocks.Add(myParagraph);

            this.Content = myFlowDocument;
        }
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents

Namespace SDKSample
    Partial Public Class ParagraphExample
        Inherits Page
        Public Sub New()

            ' Create paragraph with some text.
            Dim myParagraph As New Paragraph()
            myParagraph.Inlines.Add(New Run("Some paragraph text."))

            ' Create a FlowDocument and add the paragraph to it.
            Dim myFlowDocument As New FlowDocument()
            myFlowDocument.Blocks.Add(myParagraph)

            Me.Content = myFlowDocument
        End Sub
    End Class
End Namespace

U kunt echter ook andere inline-afgeleide elementen bevatten, zoals hieronder wordt weergegeven.

Afdeling

Section wordt alleen gebruikt om andere Block-afgeleide elementen te bevatten. Er worden geen standaardopmaak toegepast op de elementen die deze bevat. Alle eigenschapswaarden die op een Section eigenschap zijn ingesteld, zijn echter van toepassing op de onderliggende elementen. Met een sectie kunt u ook programmatisch door de onderliggende verzameling doorlopen. Section wordt op een vergelijkbare manier gebruikt als de <DIV-tag> in HTML.

In het onderstaande voorbeeld worden drie alinea's gedefinieerd onder één Section. De sectie heeft een Background eigenschapswaarde Rood, dus de achtergrondkleur van de alinea's is ook rood.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <!-- By default, Section applies no formatting to elements contained
       within it. However, in this example, the section has a Background
       property value of "Red", therefore, the three paragraphs (the block)  
       inside the section also have a red background. -->
  <Section Background="Red">
    <Paragraph>
      Paragraph 1
    </Paragraph>
    <Paragraph>
      Paragraph 2
    </Paragraph>
    <Paragraph>
      Paragraph 3
    </Paragraph>
  </Section>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;

namespace SDKSample
{
    public partial class SectionExample : Page
    {
        public SectionExample()
        {

            // Create three paragraphs
            Paragraph myParagraph1 = new Paragraph(new Run("Paragraph 1"));
            Paragraph myParagraph2 = new Paragraph(new Run("Paragraph 2"));
            Paragraph myParagraph3 = new Paragraph(new Run("Paragraph 3"));

            // Create a Section and add the three paragraphs to it.
            Section mySection = new Section();
            mySection.Background = Brushes.Red;

            mySection.Blocks.Add(myParagraph1);
            mySection.Blocks.Add(myParagraph2);
            mySection.Blocks.Add(myParagraph3);

            // Create a FlowDocument and add the section to it.
            FlowDocument myFlowDocument = new FlowDocument();
            myFlowDocument.Blocks.Add(mySection);

            this.Content = myFlowDocument;
        }
    }
}

Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents

Namespace SDKSample
    Partial Public Class SectionExample
        Inherits Page
        Public Sub New()

            ' Create three paragraphs
            Dim myParagraph1 As New Paragraph(New Run("Paragraph 1"))
            Dim myParagraph2 As New Paragraph(New Run("Paragraph 2"))
            Dim myParagraph3 As New Paragraph(New Run("Paragraph 3"))

            ' Create a Section and add the three paragraphs to it.
            Dim mySection As New Section()
            mySection.Background = Brushes.Red

            mySection.Blocks.Add(myParagraph1)
            mySection.Blocks.Add(myParagraph2)
            mySection.Blocks.Add(myParagraph3)

            ' Create a FlowDocument and add the section to it.
            Dim myFlowDocument As New FlowDocument()
            myFlowDocument.Blocks.Add(mySection)

            Me.Content = myFlowDocument
        End Sub
    End Class
End Namespace

BlockUIContainer

BlockUIContainer UIElement maakt het mogelijk om elementen (bijvoorbeeld een Button) in te sluiten in blok-afgeleide doorlopende inhoud. InlineUIContainer (zie hieronder) wordt gebruikt voor het insluiten van UIElement elementen in inline-afgeleide doorstromende inhoud. BlockUIContainer en InlineUIContainer zijn belangrijk omdat er geen andere manier is om een UIElement in stromende inhoud te gebruiken, tenzij deze zich in een van deze twee elementen bevindt.

In het volgende voorbeeld ziet u hoe u het BlockUIContainer-element gebruikt om UIElement-objecten in de stroominhoud te hosten.

<FlowDocument ColumnWidth="400">
  <Section Background="GhostWhite">
    <Paragraph>
      A UIElement element may be embedded directly in flow content
      by enclosing it in a BlockUIContainer element.
    </Paragraph>
    <BlockUIContainer>
      <Button>Click me!</Button>
    </BlockUIContainer>
    <Paragraph>
      The BlockUIContainer element may host no more than one top-level
      UIElement.  However, other UIElements may be nested within the
      UIElement contained by an BlockUIContainer element.  For example,
      a StackPanel can be used to host multiple UIElement elements within
      a BlockUIContainer element.
    </Paragraph>
    <BlockUIContainer>
      <StackPanel>
        <Label Foreground="Blue">Choose a value:</Label>
        <ComboBox>
          <ComboBoxItem IsSelected="True">a</ComboBoxItem>
          <ComboBoxItem>b</ComboBoxItem>
          <ComboBoxItem>c</ComboBoxItem>
        </ComboBox>
        <Label Foreground ="Red">Choose a value:</Label>
        <StackPanel>
          <RadioButton>x</RadioButton>
          <RadioButton>y</RadioButton>
          <RadioButton>z</RadioButton>
        </StackPanel>
        <Label>Enter a value:</Label>
        <TextBox>
          A text editor embedded in flow content.
        </TextBox>
      </StackPanel>
    </BlockUIContainer>
  </Section>
</FlowDocument>

In de volgende afbeelding ziet u hoe dit voorbeeld wordt weergegeven:

Schermopname van een UIElement dat is ingesloten in doorlopende inhoud.

Lijst

List wordt gebruikt om een lijst met opsommingstekens of numerieke lijsten te maken. Stel de MarkerStyle eigenschap in op een TextMarkerStyle opsommingswaarde om de stijl van de lijst te bepalen. In het onderstaande voorbeeld ziet u hoe u een eenvoudige lijst maakt.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <List>
    <ListItem>
      <Paragraph>
        List Item 1
      </Paragraph>
    </ListItem>
    <ListItem>
      <Paragraph>
        List Item 2
      </Paragraph>
    </ListItem>
    <ListItem>
      <Paragraph>
        List Item 3
      </Paragraph>
    </ListItem>
  </List>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;

namespace SDKSample
{
    public partial class ListExample : Page
    {
        public ListExample()
        {

            // Create three paragraphs
            Paragraph myParagraph1 = new Paragraph(new Run("List Item 1"));
            Paragraph myParagraph2 = new Paragraph(new Run("List Item 2"));
            Paragraph myParagraph3 = new Paragraph(new Run("List Item 3"));

            // Create the ListItem elements for the List and add the
            // paragraphs to them.
            ListItem myListItem1 = new ListItem();
            myListItem1.Blocks.Add(myParagraph1);
            ListItem myListItem2 = new ListItem();
            myListItem2.Blocks.Add(myParagraph2);
            ListItem myListItem3 = new ListItem();
            myListItem3.Blocks.Add(myParagraph3);

            // Create a List and add the three ListItems to it.
            List myList = new List();

            myList.ListItems.Add(myListItem1);
            myList.ListItems.Add(myListItem2);
            myList.ListItems.Add(myListItem3);

            // Create a FlowDocument and add the section to it.
            FlowDocument myFlowDocument = new FlowDocument();
            myFlowDocument.Blocks.Add(myList);

            this.Content = myFlowDocument;
        }
    }
}

Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents

Namespace SDKSample
    Partial Public Class ListExample
        Inherits Page
        Public Sub New()

            ' Create three paragraphs
            Dim myParagraph1 As New Paragraph(New Run("List Item 1"))
            Dim myParagraph2 As New Paragraph(New Run("List Item 2"))
            Dim myParagraph3 As New Paragraph(New Run("List Item 3"))

            ' Create the ListItem elements for the List and add the 
            ' paragraphs to them.
            Dim myListItem1 As New ListItem()
            myListItem1.Blocks.Add(myParagraph1)
            Dim myListItem2 As New ListItem()
            myListItem2.Blocks.Add(myParagraph2)
            Dim myListItem3 As New ListItem()
            myListItem3.Blocks.Add(myParagraph3)

            ' Create a List and add the three ListItems to it.
            Dim myList As New List()

            myList.ListItems.Add(myListItem1)
            myList.ListItems.Add(myListItem2)
            myList.ListItems.Add(myListItem3)

            ' Create a FlowDocument and add the section to it.
            Dim myFlowDocument As New FlowDocument()
            myFlowDocument.Blocks.Add(myList)

            Me.Content = myFlowDocument
        End Sub
    End Class
End Namespace

Opmerking

List is het enige stromingselement dat gebruikmaakt van ListItemCollection om subelementen te beheren.

Tabel

Table wordt gebruikt om een tabel te maken. Table is vergelijkbaar met het Grid element, maar heeft meer mogelijkheden en vereist daarom meer overhead voor resources. Aangezien Grid een UIElement is, kan deze niet worden gebruikt in doorlopende inhoud, tenzij deze is opgenomen in een BlockUIContainer of InlineUIContainer. Zie Table voor meer informatie.

Inline-afgeleide klassen

Rennen

Run wordt gebruikt om niet-opgemaakte tekst te bevatten. U kunt verwachten dat Run objecten veelvuldig worden gebruikt in vloeiende inhoud. In markeringen Run hoeven elementen echter niet expliciet te worden gebruikt. Run moet worden gebruikt bij het maken of bewerken van stroomdocumenten met behulp van code. In de onderstaande markeringen geeft de eerste Paragraph bijvoorbeeld het Run element expliciet op, terwijl de tweede dat niet doet. Beide alinea's genereren identieke uitvoer.

<Paragraph>
  <Run>Paragraph that explicitly uses the Run element.</Run>
</Paragraph>

<Paragraph>
  This Paragraph omits the Run element in markup. It renders
  the same as a Paragraph with Run used explicitly. 
</Paragraph>

Opmerking

Vanaf .NET Framework 4 is de Text eigenschap van het Run object een afhankelijkheidseigenschap. U kunt de Text eigenschap verbinden met een gegevensbron, zoals een TextBlock. De Text eigenschap biedt volledige ondersteuning voor binding in één richting. De Text eigenschap biedt ook ondersteuning voor tweerichtingsbindingen, met uitzondering van RichTextBox. Zie Run.Textvoor een voorbeeld.

Span

Span groepeert andere inline-inhoudselementen. Er wordt geen inherente rendering toegepast op inhoud binnen een Span element. Elementen die erven van Span, inclusief Hyperlink, Bold, Italic en Underline, passen echter opmaak toe op tekst.

Hieronder ziet u een voorbeeld van een Span die wordt gebruikt om inline inhoud te bevatten, waaronder tekst, een Bold element en een Button.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <Paragraph>
    Text before the Span. <Span Background="Red">Text within the Span is
    red and <Bold>this text is inside the Span-derived element Bold.</Bold>
    A Span can contain more then text, it can contain any inline content. For
    example, it can contain a 
    <InlineUIContainer>
      <Button>Button</Button>
    </InlineUIContainer>
    or other UIElement, a Floater, a Figure, etc.</Span>
  </Paragraph>

</FlowDocument>

In de volgende schermopname ziet u hoe dit voorbeeld wordt weergegeven.

Schermopname: voorbeeld van een weergegeven span

InlineUIContainer

InlineUIContainer UIElement maakt het mogelijk dat elementen (bijvoorbeeld een besturingselement zoals Button) worden ingesloten in een Inline inhoudselement. Dit element is het inline-equivalent zoals hierboven beschreven met BlockUIContainer. Hieronder ziet u een voorbeeld dat InlineUIContainer gebruikt om een Button inline in een Paragraph in te voegen.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <Paragraph>
    Text to precede the button...

    <!-- Set the BaselineAlignment property to "Bottom" 
         so that the Button aligns properly with the text. -->
    <InlineUIContainer BaselineAlignment="Bottom">
      <Button>Button</Button>
    </InlineUIContainer>
    Text to follow the button...
  </Paragraph>

</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;

namespace SDKSample
{
    public partial class InlineUIContainerExample : Page
    {
        public InlineUIContainerExample()
        {
            Run run1 = new Run(" Text to precede the button... ");
            Run run2 = new Run(" Text to follow the button... ");

            // Create a new button to be hosted in the paragraph.
            Button myButton = new Button();
            myButton.Content = "Click me!";

            // Create a new InlineUIContainer to contain the Button.
            InlineUIContainer myInlineUIContainer = new InlineUIContainer();

            // Set the BaselineAlignment property to "Bottom" so that the
            // Button aligns properly with the text.
            myInlineUIContainer.BaselineAlignment = BaselineAlignment.Bottom;

            // Asign the button as the UI container's child.
            myInlineUIContainer.Child = myButton;

            // Create the paragraph and add content to it.
            Paragraph myParagraph = new Paragraph();
            myParagraph.Inlines.Add(run1);
            myParagraph.Inlines.Add(myInlineUIContainer);
            myParagraph.Inlines.Add(run2);

            // Create a FlowDocument and add the paragraph to it.
            FlowDocument myFlowDocument = new FlowDocument();
            myFlowDocument.Blocks.Add(myParagraph);

            this.Content = myFlowDocument;
        }
    }
}

Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents

Namespace SDKSample
    Partial Public Class InlineUIContainerExample
        Inherits Page
        Public Sub New()
            Dim run1 As New Run(" Text to precede the button... ")
            Dim run2 As New Run(" Text to follow the button... ")

            ' Create a new button to be hosted in the paragraph.
            Dim myButton As New Button()
            myButton.Content = "Click me!"

            ' Create a new InlineUIContainer to contain the Button.
            Dim myInlineUIContainer As New InlineUIContainer()

            ' Set the BaselineAlignment property to "Bottom" so that the 
            ' Button aligns properly with the text.
            myInlineUIContainer.BaselineAlignment = BaselineAlignment.Bottom

            ' Asign the button as the UI container's child.
            myInlineUIContainer.Child = myButton

            ' Create the paragraph and add content to it.
            Dim myParagraph As New Paragraph()
            myParagraph.Inlines.Add(run1)
            myParagraph.Inlines.Add(myInlineUIContainer)
            myParagraph.Inlines.Add(run2)

            ' Create a FlowDocument and add the paragraph to it.
            Dim myFlowDocument As New FlowDocument()
            myFlowDocument.Blocks.Add(myParagraph)

            Me.Content = myFlowDocument
        End Sub
    End Class
End Namespace

Opmerking

InlineUIContainer hoeft niet expliciet in markeringen te worden gebruikt. Als u deze weglaat, wordt er toch een InlineUIContainer gemaakt wanneer de code wordt gecompileerd.

Afbeelding en zwevende elementen

Figure en Floater worden gebruikt voor het insluiten van inhoud in Flow-documenten met plaatsingseigenschappen die onafhankelijk van de primaire inhoudsstroom kunnen worden aangepast. Figure of Floater elementen worden vaak gebruikt om delen van inhoud te markeren of accentueren, om ondersteunende afbeeldingen of andere inhoud binnen de hoofdinhoudsstroom te hosten, of om losjes gerelateerde inhoud zoals advertenties te injecteren.

In het volgende voorbeeld ziet u hoe u een Figure insluit in een alinea met tekst.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <Paragraph>
    <Figure 
      Width="300" Height="100" 
      Background="GhostWhite" HorizontalAnchor="PageLeft" >
      <Paragraph FontStyle="Italic" Background="Beige" Foreground="DarkGreen" >
        A Figure embeds content into flow content with placement properties 
        that can be customized independently from the primary content flow
      </Paragraph>
    </Figure>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
    nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi
    enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
    nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.
  </Paragraph>

</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;

namespace SDKSample
{
    public partial class FigureExample : Page
    {
        public FigureExample()
        {

            // Create strings to use as content.
            string strFigure = "A Figure embeds content into flow content with" +
                               " placement properties that can be customized" +
                               " independently from the primary content flow";
            string strOther = "Lorem ipsum dolor sit amet, consectetuer adipiscing" +
                              " elit, sed diam nonummy nibh euismod tincidunt ut laoreet" +
                              " dolore magna aliquam erat volutpat. Ut wisi enim ad" +
                              " minim veniam, quis nostrud exerci tation ullamcorper" +
                              " suscipit lobortis nisl ut aliquip ex ea commodo consequat." +
                              " Duis autem vel eum iriure.";

            // Create a Figure and assign content and layout properties to it.
            Figure myFigure = new Figure();
            myFigure.Width = new FigureLength(300);
            myFigure.Height = new FigureLength(100);
            myFigure.Background = Brushes.GhostWhite;
            myFigure.HorizontalAnchor = FigureHorizontalAnchor.PageLeft;
            Paragraph myFigureParagraph = new Paragraph(new Run(strFigure));
            myFigureParagraph.FontStyle = FontStyles.Italic;
            myFigureParagraph.Background = Brushes.Beige;
            myFigureParagraph.Foreground = Brushes.DarkGreen;
            myFigure.Blocks.Add(myFigureParagraph);

            // Create the paragraph and add content to it.
            Paragraph myParagraph = new Paragraph();
            myParagraph.Inlines.Add(myFigure);
            myParagraph.Inlines.Add(new Run(strOther));

            // Create a FlowDocument and add the paragraph to it.
            FlowDocument myFlowDocument = new FlowDocument();
            myFlowDocument.Blocks.Add(myParagraph);

            this.Content = myFlowDocument;
        }
    }
}

Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents

Namespace SDKSample
    Partial Public Class FigureExample
        Inherits Page
        Public Sub New()

            ' Create strings to use as content.
            Dim strFigure As String = "A Figure embeds content into flow content with" & " placement properties that can be customized" & " independently from the primary content flow"
            Dim strOther As String = "Lorem ipsum dolor sit amet, consectetuer adipiscing" & " elit, sed diam nonummy nibh euismod tincidunt ut laoreet" & " dolore magna aliquam erat volutpat. Ut wisi enim ad" & " minim veniam, quis nostrud exerci tation ullamcorper" & " suscipit lobortis nisl ut aliquip ex ea commodo consequat." & " Duis autem vel eum iriure."

            ' Create a Figure and assign content and layout properties to it.
            Dim myFigure As New Figure()
            myFigure.Width = New FigureLength(300)
            myFigure.Height = New FigureLength(100)
            myFigure.Background = Brushes.GhostWhite
            myFigure.HorizontalAnchor = FigureHorizontalAnchor.PageLeft
            Dim myFigureParagraph As New Paragraph(New Run(strFigure))
            myFigureParagraph.FontStyle = FontStyles.Italic
            myFigureParagraph.Background = Brushes.Beige
            myFigureParagraph.Foreground = Brushes.DarkGreen
            myFigure.Blocks.Add(myFigureParagraph)

            ' Create the paragraph and add content to it.
            Dim myParagraph As New Paragraph()
            myParagraph.Inlines.Add(myFigure)
            myParagraph.Inlines.Add(New Run(strOther))

            ' Create a FlowDocument and add the paragraph to it.
            Dim myFlowDocument As New FlowDocument()
            myFlowDocument.Blocks.Add(myParagraph)

            Me.Content = myFlowDocument
        End Sub
    End Class
End Namespace

In de volgende afbeelding ziet u hoe dit voorbeeld wordt weergegeven.

Schermopname: Voorbeeldafbeelding

Figure en Floater verschillen op verschillende manieren en worden gebruikt voor verschillende scenario's.

Cijfer:

  • Positie instellen: u kunt de horizontale en verticale ankers instellen om deze relatief aan de pagina, inhoud, kolom of alinea te koppelen. U kunt ook de eigenschappen HorizontalOffset en VerticalOffset gebruiken om willekeurige verschuivingen op te geven.

  • Is aanpasbaar naar meer dan één kolom: u kunt de Figure hoogte en breedte instellen op veelvouden van pagina-, inhouds- of kolomhoogte of -breedte. Houd er rekening mee dat in het geval van pagina en inhoud veelvouden groter dan 1 niet zijn toegestaan. U kunt bijvoorbeeld de breedte van een Figure instellen op "0,5 pagina", "0,25 inhoud" of "2 kolommen". U kunt ook de hoogte en breedte instellen op absolute pixelwaarden.

  • Pagineert niet: Als de inhoud in een Figure niet binnen de Figureinhoud past, wordt de inhoud weergegeven die past en gaat de resterende inhoud verloren

Floater:

  • Kan niet worden geplaatst en wordt weergegeven waar ruimte beschikbaar kan worden gesteld. U kunt de verschuiving en het anker niet instellen voor een Floater.

  • Kan niet groter worden gemaakt dan één kolom: Floater past standaard in één kolom. Deze heeft een Width eigenschap die kan worden ingesteld op een absolute pixelwaarde, maar als deze waarde groter is dan één kolombreedte, wordt deze genegeerd en heeft de floater de grootte van één kolom. U kunt de grootte wijzigen in minder dan één kolom door de juiste pixelbreedte in te stellen, maar de grootte is niet kolom-relatief, dus '0,5Column' is geen geldige expressie voor Floater breedte. Floater heeft geen hoogte-eigenschap en de hoogte kan niet worden ingesteld, de hoogte is afhankelijk van de inhoud

  • Floater pagineren: Als de inhoud van de opgegeven breedte meer dan 1 kolomhoogte overschrijdt, gaan zwevende elementen over naar de volgende kolom, de volgende pagina, enzovoort.

Figure is een goede plek om zelfstandige inhoud te plaatsen waar u de grootte en plaatsing wilt bepalen en erop kunt vertrouwen dat de inhoud in de opgegeven grootte past. Floater is een goede plek om meer vrije stromende inhoud te plaatsen die vergelijkbaar is met de inhoud van de hoofdpagina, maar is ervan gescheiden.

LineBreak

LineBreak veroorzaakt een regeleinde in vloeiende inhoud. In het volgende voorbeeld ziet u het gebruik van LineBreak.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Paragraph>
    Before the LineBreak in Paragraph.
    <LineBreak />
    After the LineBreak in Paragraph.
    <LineBreak/><LineBreak/>
    After two LineBreaks in Paragraph.
  </Paragraph>

  <Paragraph>
    <LineBreak/>
  </Paragraph>

  <Paragraph>
    After a Paragraph with only a LineBreak in it.
  </Paragraph>
</FlowDocument>

In de volgende schermopname ziet u hoe dit voorbeeld wordt weergegeven.

Schermopname: LineBreak-voorbeeld

Elementen van stroomverzameling

In veel van de bovenstaande voorbeelden worden de BlockCollection en InlineCollection gebruikt voor het programmatisch samenstellen van stroominhoud. Als u bijvoorbeeld elementen wilt toevoegen aan een Paragraph, kunt u de syntaxis gebruiken:

myParagraph.Inlines.Add(new Run("Some text"));

Hiermee wordt een Run toegevoegd aan de InlineCollection van de Paragraph. Dit is hetzelfde als de impliciete Run gevonden in een Paragraph markering:

<Paragraph>
Some Text
</Paragraph>

Als een voorbeeld van het gebruik van BlockCollection, wordt in het volgende voorbeeld een nieuwe Section gemaakt en vervolgens de methode Toevoegen gebruikt om een nieuwe Paragraph aan de Section inhoud toe te voegen.

Section secx = new Section();
secx.Blocks.Add(new Paragraph(new Run("A bit of text content...")));
Dim secx As New Section()
secx.Blocks.Add(New Paragraph(New Run("A bit of text content...")))

Naast het toevoegen van items aan een stroomverzameling kunt u ook items verwijderen. In het volgende voorbeeld wordt het laatste Inline element in de Spanverwijderd.

spanx.Inlines.Remove(spanx.Inlines.LastInline);
spanx.Inlines.Remove(spanx.Inlines.LastInline)

In het volgende voorbeeld worden alle inhoud (Inline elementen) uit de Spangewist.

spanx.Inlines.Clear();
spanx.Inlines.Clear()

Wanneer u programmatisch met stroominhoud werkt, maakt u waarschijnlijk uitgebreid gebruik van deze verzamelingen.

Of een flow-element een InlineCollection (Inline) of BlockCollection (Blokken) gebruikt om onderliggende elementen te bevatten, hangt af van het type onderliggende elementen (Block of Inline) dat door het bovenliggende element kan worden opgenomen. Insluitingsregels voor stroominhoudselementen worden samengevat in het inhoudsschema in de volgende sectie.

Opmerking

Er is een derde type verzameling dat wordt gebruikt met stroominhoud, de ListItemCollection, maar deze verzameling wordt alleen gebruikt met een List. Daarnaast worden er verschillende collecties gebruikt bij Table. Zie Tabeloverzicht voor meer informatie.

Inhoudsschema

Gezien het aantal verschillende elementen van stroominhoud kan het overweldigend zijn om bij te houden welk type onderliggende elementen een element kan bevatten. In het onderstaande diagram worden de insluitingsregels voor stroomelementen samengevat. De pijlen geven de mogelijke ouder/kind-relaties aan.

diagram: stromingsinhoudschema

Zoals te zien is in het bovenstaande diagram, worden de elementen die zijn toegestaan voor een element niet noodzakelijkerwijs bepaald door of het een Block element is of een Inline element. Bijvoorbeeld, een Span (een Inline element) kan alleen Inline onderliggende elementen hebben, terwijl een Figure (ook een Inline element) alleen Block onderliggende elementen kan hebben. Daarom is een diagram handig om snel te bepalen welk element in een ander element kan worden opgenomen. Laten we bijvoorbeeld het diagram gebruiken om te bepalen hoe de stroominhoud van een RichTextBoxmoet worden samengesteld.

1. Een RichTextBox moet een FlowDocument object bevatten dat op zijn beurt een Block-afgeleide object moet bevatten. Hieronder ziet u het bijbehorende segment uit het bovenstaande diagram.

Diagram: RichTextBox-insluitingsregels

Tot nu toe is dit hoe de markeringen eruit kunnen zien.

<RichTextBox>
  <FlowDocument>
    <!-- One or more Block-derived object… -->
  </FlowDocument>
</RichTextBox>

2. Volgens het diagram zijn er verschillende Block elementen waaruit u kunt kiezen, waaronderParagraph, SectionTable, , Listen BlockUIContainer (zie bovenstaande blokklassen). Stel dat we een Tablewillen. Volgens het bovenstaande diagram bevat een Table een TableRowGroup dat TableRow elementen bevat, die op hun beurt TableCell elementen bevatten welke op hun beurt een object bevatten dat is afgeleid van Block. Hieronder ziet u het bijbehorende segment Table dat uit het bovenstaande diagram is genomen.

Diagram: ouder/kind-schema voor Tabel

Hieronder ziet u de bijbehorende markeringen.

<RichTextBox>
  <FlowDocument>
    <Table>
      <TableRowGroup>
        <TableRow>
          <TableCell>
            <!-- One or more Block-derived object… -->
          </TableCell>
        </TableRow>
      </TableRowGroup>
    </Table>
  </FlowDocument>
</RichTextBox>

3. Nogmaals, een of meer Block elementen zijn vereist onder een TableCell. Om het eenvoudig te maken, plaatsen we tekst in de cel. We kunnen dit doen met behulp van een Paragraph met een Run element. Hieronder ziet u de bijbehorende segmenten uit het diagram waarin wordt weergegeven dat een Paragraph een Inline element kan bevatten en dat een Run (een Inline element) alleen platte tekst kan bevatten.

Diagram: ouder/kind schema voor Paragraaf

Diagram: ouder/kind schema voor Run

Hieronder ziet u het volledige voorbeeld in markeringen.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <RichTextBox>
    <FlowDocument>
      
      <!-- Normally a table would have multiple rows and multiple
           cells but this code is for demonstration purposes.-->
      <Table>
        <TableRowGroup>
          <TableRow>
            <TableCell>
              <Paragraph>

                <!-- The schema does not actually require
                     explicit use of the Run tag in markup. It 
                     is only included here for clarity. -->
                <Run>Paragraph in a Table Cell.</Run>
              </Paragraph>
            </TableCell>
          </TableRow>
        </TableRowGroup>
      </Table>

    </FlowDocument>
  </RichTextBox>
</Page>

Tekst aanpassen

Meestal is tekst het meest voorkomende type inhoud in een stroomdocument. Hoewel de hierboven geïntroduceerde objecten kunnen worden gebruikt om de meeste aspecten van de weergave van tekst te bepalen, zijn er enkele andere methoden voor het aanpassen van tekst die in deze sectie wordt behandeld.

Tekstdecoraties

Met tekstdecoraties kunt u de onderstrepings-, overlijn-, basislijn- en doorhalen-effecten toepassen op tekst (zie afbeeldingen hieronder). Deze decoraties worden toegevoegd met behulp van de TextDecorations eigenschap die wordt weergegeven door een aantal objecten, waaronder Inline, Paragraph, TextBlocken TextBox.

In het volgende voorbeeld ziet u hoe u de TextDecorations-eigenschap van een Paragraph instelt.

<FlowDocument ColumnWidth="200">
  <Paragraph TextDecorations="Strikethrough">
    This text will render with the strikethrough effect.
  </Paragraph>
</FlowDocument>
Paragraph parx = new Paragraph(new Run("This text will render with the strikethrough effect."));
parx.TextDecorations = TextDecorations.Strikethrough;
Dim parx As New Paragraph(New Run("This text will render with the strikethrough effect."))
parx.TextDecorations = TextDecorations.Strikethrough

In de volgende afbeelding ziet u hoe dit voorbeeld wordt weergegeven.

Schermopname: Tekst met standaard doorhalen-effect

In de volgende afbeeldingen ziet u hoe de decoraties Overline, Basislijn en Onderstreping worden weergegeven.

Schermopname: Overline TextDecorator

Schermopname: Standaardbasislijneffect voor tekst

Schermafbeelding: Tekst met standaard onderstrepen-effect

Typografie

De Typography eigenschap wordt weergegeven door de meeste stroomgerelateerde inhoud, waaronder TextElement, FlowDocumenten TextBlockTextBox. Deze eigenschap wordt gebruikt voor het beheren van typografische kenmerken/variaties van tekst (dat wil bijvoorbeeld kleine of grote hoofdletters, superscripts en subscripts maken, enzovoort).

In het volgende voorbeeld ziet u hoe u het kenmerk Typography instelt met behulp van Paragraph als voorbeeldelement.

<Paragraph
  TextAlignment="Left"
  FontSize="18" 
  FontFamily="Palatino Linotype"
  Typography.NumeralStyle="OldStyle"
  Typography.Fraction="Stacked"
  Typography.Variants="Inferior"
>
  <Run>
    This text has some altered typography characteristics.  Note
    that use of an open type font is necessary for most typographic
    properties to be effective.
  </Run>
  <LineBreak/><LineBreak/>
  <Run>
    0123456789 10 11 12 13
  </Run>
  <LineBreak/><LineBreak/>
  <Run>
    1/2 2/3 3/4
  </Run>
</Paragraph>

In de volgende afbeelding ziet u hoe dit voorbeeld wordt weergegeven.

Schermopname van tekst met gewijzigde typografie.

In de volgende afbeelding ziet u daarentegen hoe een vergelijkbaar voorbeeld met standaard typografische eigenschappen wordt weergegeven.

Schermopname van tekst met standaard typografie.

In het volgende voorbeeld ziet u hoe u de eigenschap Typography programmatisch instelt.

Paragraph par = new Paragraph();

Run runText = new Run(
    "This text has some altered typography characteristics.  Note" +
    "that use of an open type font is necessary for most typographic" +
    "properties to be effective.");
Run runNumerals = new Run("0123456789 10 11 12 13");
Run runFractions = new Run("1/2 2/3 3/4");

par.Inlines.Add(runText);
par.Inlines.Add(new LineBreak());
par.Inlines.Add(new LineBreak());
par.Inlines.Add(runNumerals);
par.Inlines.Add(new LineBreak());
par.Inlines.Add(new LineBreak());
par.Inlines.Add(runFractions);

par.TextAlignment = TextAlignment.Left;
par.FontSize = 18;
par.FontFamily = new FontFamily("Palatino Linotype");

par.Typography.NumeralStyle = FontNumeralStyle.OldStyle;
par.Typography.Fraction = FontFraction.Stacked;
par.Typography.Variants = FontVariants.Inferior;
Dim par As New Paragraph()

Dim runText As New Run("This text has some altered typography characteristics.  Note" & "that use of an open type font is necessary for most typographic" & "properties to be effective.")
Dim runNumerals As New Run("0123456789 10 11 12 13")
Dim runFractions As New Run("1/2 2/3 3/4")

par.Inlines.Add(runText)
par.Inlines.Add(New LineBreak())
par.Inlines.Add(New LineBreak())
par.Inlines.Add(runNumerals)
par.Inlines.Add(New LineBreak())
par.Inlines.Add(New LineBreak())
par.Inlines.Add(runFractions)

par.TextAlignment = TextAlignment.Left
par.FontSize = 18
par.FontFamily = New FontFamily("Palatino Linotype")

par.Typography.NumeralStyle = FontNumeralStyle.OldStyle
par.Typography.Fraction = FontFraction.Stacked
par.Typography.Variants = FontVariants.Inferior

Zie Typografie in WPF voor meer informatie over typografie.

Zie ook