RichTextBox – přehled

Ovládací RichTextBox prvek umožňuje zobrazit nebo upravit obsah toku včetně odstavců, obrázků, tabulek a dalších. Toto téma představuje TextBox třídu a poskytuje příklady, jak ji používat v jazyce XAML (Extensible Application Markup Language) i v jazyce C#.

Ovládací prvek RichTextBox zobrazující stylovaný obsah s různými písmy a barvami.

TextBox nebo RichTextBox

Oba ovládací prvky, RichTextBox a TextBox, umožňují uživatelům upravovat text, avšak se používají v různých scénářích. A RichTextBox je lepší volbou, když je nutné, aby uživatel upravil formátovaný text, obrázky, tabulky nebo jiný formátovaný obsah. Například úprava dokumentu, článku nebo blogu, který vyžaduje formátování, obrázky apod., se nejlépe provádí pomocí RichTextBox. A TextBox vyžaduje méně systémových prostředků než a RichTextBox je ideální, když je potřeba upravit jenom prostý text (tj. použití ve formulářích). Vizte TextBox pro další informace o TextBox. Následující tabulka shrnuje hlavní funkce TextBox a RichTextBox.

Řízení Kontrola pravopisu v reálném čase Kontextová nabídka Formátování příkazů jako ToggleBold (Ctr+B) FlowDocument obsah, jako jsou obrázky, odstavce, tabulky atd.
TextBox Ano Ano Ne Ne.
RichTextBox Ano Ano Ano Ano

Poznámka:

I když TextBox nepodporuje formátování souvisejících příkazů, jako je ToggleBold (Ctr+B), podporuje mnoho základních příkazů oba ovládací prvky, například MoveToLineEnd.

Funkce z výše uvedené tabulky jsou podrobněji popsány později.

Styly a šablony

Výchozí nastavení ControlTemplate můžete upravit tak, aby ovládací prvek získal jedinečný vzhled. Další informace o úpravě šablony ovládacího prvku najdete v tématu Vytvoření šablony ovládacího prvku.

Vlastnost obsahu

Vlastnost Document je vlastnost obsahu pro RichTextBox. Obsahuje FlowDocument s bohatým obsahem, který se zobrazuje nebo upravuje.

Součástky

Následující tabulka uvádí pojmenované části RichTextBox ovládacího prvku.

Část Typ Description
PART_ContentHost FrameworkElement Prvek architektury, který obsahuje obsah textového pole.

Vizuální stavy

Následující tabulka uvádí vizuální stavy RichTextBox ovládacího prvku.

Název VisualState Název skupiny VisualStateGroup Description
Normální CommonStates Ovládací prvek je v normálním stavu.
Mouseover CommonStates Myš je umístěna nad ovládacím prvkem.
Disabled CommonStates Ovládací prvek je zakázaný.
ReadOnly CommonStates Ovládací prvek je jen pro čtení.
Focused FocusStates Ovládací prvek má fokus klávesnice.
Nezaměřený FocusStates Ovládací prvek nemá fokus klávesnice.
Valid StavyOvěření Ovládací prvek je platný a nemá žádné chyby ověření.
Neplatný fokus StavyOvěření Ovládací prvek má chybu validace a klávesnicový fokus.
NeplatnýBezZaostření StavyOvěření Ovládací prvek má chybu ověření, ale nemá zaměření klávesnice.

Vytvoření richtextboxu

Následující kód ukazuje, jak vytvořit RichTextBox , aby uživatel mohl upravovat bohatý obsah.

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

    <!-- A RichTextBox with no initial content in it. -->
    <RichTextBox />

</Page>

Konkrétně je upravovaný obsah v RichTextBox tokový obsah. Obsah toku může obsahovat mnoho typů prvků, včetně formátovaného textu, obrázků, seznamů a tabulek. Podrobné informace o dokumentech toku naleznete v přehledu dokumentu toku. Aby bylo možné obsahovat tokový obsah, RichTextBox hostuje objekt FlowDocument, který obsahuje upravitelný obsah. Pro předvedení obsahu toku ve RichTextBox následující kód ukazuje, jak vytvořit RichTextBox s odstavcem a nějakým tučným textem.

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

  <StackPanel>
    <RichTextBox>
      <FlowDocument>
        <Paragraph>
          This is flow content and you can <Bold>edit me!</Bold>
        </Paragraph>
      </FlowDocument>
    </RichTextBox>
  </StackPanel>

</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Documents;
namespace SDKSample
{
    public partial class BasicRichTextBoxWithContentExample : Page
    {
        public BasicRichTextBoxWithContentExample()
        {
            StackPanel myStackPanel = new StackPanel();

            // Create a FlowDocument to contain content for the RichTextBox.
            FlowDocument myFlowDoc = new FlowDocument();

            // Create a Run of plain text and some bold text.
            Run myRun = new Run("This is flow content and you can ");
            Bold myBold = new Bold(new Run("edit me!"));

            // Create a paragraph and add the Run and Bold to it.
            Paragraph myParagraph = new Paragraph();
            myParagraph.Inlines.Add(myRun);
            myParagraph.Inlines.Add(myBold);

            // Add the paragraph to the FlowDocument.
            myFlowDoc.Blocks.Add(myParagraph);

            RichTextBox myRichTextBox = new RichTextBox();

            // Add initial content to the RichTextBox.
            myRichTextBox.Document = myFlowDoc;

            myStackPanel.Children.Add(myRichTextBox);
            this.Content = myStackPanel;
        }
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Documents
Namespace SDKSample
    Partial Public Class BasicRichTextBoxWithContentExample
        Inherits Page
        Public Sub New()
            Dim myStackPanel As New StackPanel()

            ' Create a FlowDocument to contain content for the RichTextBox.
            Dim myFlowDoc As New FlowDocument()

            ' Create a Run of plain text and some bold text.
            Dim myRun As New Run("This is flow content and you can ")
            Dim myBold As New Bold(New Run("edit me!"))

            ' Create a paragraph and add the Run and Bold to it.
            Dim myParagraph As New Paragraph()
            myParagraph.Inlines.Add(myRun)
            myParagraph.Inlines.Add(myBold)

            ' Add the paragraph to the FlowDocument.
            myFlowDoc.Blocks.Add(myParagraph)

            Dim myRichTextBox As New RichTextBox()

            ' Add initial content to the RichTextBox.
            myRichTextBox.Document = myFlowDoc

            myStackPanel.Children.Add(myRichTextBox)
            Me.Content = myStackPanel

        End Sub
    End Class
End Namespace

Následující obrázek ukazuje, jak tato ukázka vypadá.

Ovládací prvek RichTextBox s formátovaným obsahem včetně tučného textu

Prvky jako Paragraph a Bold určují, jak se obsah uvnitř RichTextBox zobrazí. Když uživatel upravuje RichTextBox obsah, mění tento obsah toku. Další informace o funkcích obsahu toku a o tom, jak s ním pracovat, najdete v tématu Přehled dokumentu toku.

Poznámka:

Obsah toku uvnitř objektu RichTextBox se nechová přesně jako obsah toku obsažený v jiných ovládacích prvcích. Například v RichTextBox nejsou žádné sloupce, a proto není žádné chování automatické změny velikosti. Integrované funkce, jako je vyhledávání, režim zobrazení, navigace na stránkách a zoomování, nejsou k dispozici v rámci RichTextBox.

Kontrola pravopisu v reálném čase

Kontrolu pravopisu v reálném čase můžete povolit v aplikaci TextBox nebo RichTextBox. Když je kontrola pravopisu zapnutá, pod chybně napsanými slovy se zobrazí červená čára (viz obrázek níže).

Textové pole s kontrolou pravopisu s červeným podtržením pod chybně napsanými slovy

Informace o povolení kontroly pravopisu v ovládacím prvku pro úpravy textu najdete v tématu Povolení kontroly pravopisu v ovládacím prvku pro úpravy textu .

Kontextová nabídka

Ve výchozím nastavení mají jak TextBox, tak RichTextBox místní nabídku, která se zobrazí, když uživatel klikne pravým tlačítkem myši uvnitř každého ovládacího prvku. Místní nabídka umožňuje uživateli vyjmout, zkopírovat nebo vložit (viz obrázek níže).

TextBox s místní nabídkou zobrazující možnosti Vyjmout, Kopírovat a Vložit

Můžete vytvořit vlastní přizpůsobenou místní nabídku, která přepíše výchozí nabídku. Další informace naleznete v článku Umístění vlastní místní nabídky v RichTextBox.

Úpravy příkazů

Příkazy pro úpravy umožňují uživatelům formátovat upravitelný obsah uvnitř RichTextBox. Kromě základních příkazů pro úpravy zahrnuje příkazy formátování, RichTextBox které TextBox nepodporují. Například při úpravách v aplikaci RichTextBoxmůže uživatel stisknout klávesu Ctr+B, aby přepnul tučné formátování textu. Podívejte se EditingCommands na úplný seznam dostupných příkazů. Kromě používání klávesových zkratek můžete příkazy připojit k jiným ovládacím prvkům, jako jsou tlačítka. Následující příklad ukazuje, jak vytvořit jednoduchý panel nástrojů obsahující tlačítka, která může uživatel použít ke změně formátování textu.

<Window x:Class="RichTextBoxInputPanelDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="400" Width="600"
    >
  <Grid>

    <!-- Set the styles for the tool bar. -->
    <Grid.Resources>
      <Style TargetType="{x:Type Button}" x:Key="formatTextStyle">
        <Setter Property="FontFamily" Value="Palatino Linotype"></Setter>
        <Setter Property="Width" Value="30"></Setter>
        <Setter Property="FontSize" Value ="14"></Setter>
        <Setter Property="CommandTarget" Value="{Binding ElementName=mainRTB}"></Setter>
      </Style>

      <Style TargetType="{x:Type Button}" x:Key="formatImageStyle">
        <Setter Property="Width" Value="30"></Setter>
        <Setter Property="CommandTarget" Value="{Binding ElementName=mainRTB}"></Setter>
      </Style>
    </Grid.Resources>

    <DockPanel Name="mainPanel">

      <!-- This tool bar contains all the editing buttons. -->
      <ToolBar Name="mainToolBar" Height="30" DockPanel.Dock="Top">

        <Button Style="{StaticResource formatImageStyle}" Command="ApplicationCommands.Cut" ToolTip="Cut">
          <Image Source="Images\EditCut.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="ApplicationCommands.Copy" ToolTip="Copy">
          <Image Source="Images\EditCopy.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="ApplicationCommands.Paste" ToolTip="Paste">
          <Image Source="Images\EditPaste.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="ApplicationCommands.Undo" ToolTip="Undo">
          <Image Source="Images\EditUndo.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="ApplicationCommands.Redo" ToolTip="Redo">
          <Image Source="Images\EditRedo.png"></Image>
        </Button>

        <Button Style="{StaticResource formatTextStyle}" Command="EditingCommands.ToggleBold" ToolTip="Bold">
          <TextBlock FontWeight="Bold">B</TextBlock>
        </Button>
        <Button Style="{StaticResource formatTextStyle}" Command="EditingCommands.ToggleItalic" ToolTip="Italic">
          <TextBlock FontStyle="Italic" FontWeight="Bold">I</TextBlock>
        </Button>
        <Button Style="{StaticResource formatTextStyle}" Command="EditingCommands.ToggleUnderline" ToolTip="Underline">
          <TextBlock TextDecorations="Underline" FontWeight="Bold">U</TextBlock>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.IncreaseFontSize" ToolTip="Grow Font">
          <Image Source="Images\CharacterGrowFont.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.DecreaseFontSize" ToolTip="Shrink Font">
          <Image Source="Images\CharacterShrinkFont.png"></Image>
        </Button>

        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.ToggleBullets" ToolTip="Bullets">
          <Image Source="Images\ListBullets.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.ToggleNumbering" ToolTip="Numbering">
          <Image Source="Images/ListNumbering.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.AlignLeft" ToolTip="Align Left">
          <Image Source="Images\ParagraphLeftJustify.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.AlignCenter" ToolTip="Align Center">
          <Image Source="Images\ParagraphCenterJustify.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.AlignRight" ToolTip="Align Right">
          <Image Source="Images\ParagraphRightJustify.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.AlignJustify" ToolTip="Align Justify">
          <Image Source="Images\ParagraphFullJustify.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.IncreaseIndentation" ToolTip="Increase Indent">
          <Image Source="Images\ParagraphIncreaseIndentation.png"></Image>
        </Button>
        <Button Style="{StaticResource formatImageStyle}" Command="EditingCommands.DecreaseIndentation" ToolTip="Decrease Indent">
          <Image Source="Images\ParagraphDecreaseIndentation.png"></Image>
        </Button>

      </ToolBar>

      <!-- By default pressing tab moves focus to the next control. Setting AcceptsTab to true allows the 
           RichTextBox to accept tab characters. -->
      <RichTextBox Name="mainRTB" AcceptsTab="True"></RichTextBox>
    </DockPanel>
  </Grid>
</Window>

Následující ilustrace ukazuje, jak se tento příklad zobrazuje.

RichTextBox s ToolBarem ukazujícím formátovací tlačítka pro tučné písmo, kurzívu a podtržení

Zjištění, kdy se změní obsah

Obvykle by se měla používat událost TextChanged ke zjištění, kdy se změní text v TextBox nebo RichTextBox, spíše než jak byste očekávali u KeyDown. Příklad najdete v tématu Zjistit, kdy se text v textovém poli změnil .

Uložení, načtení a tisk obsahu RichTextBox

Následující příklad ukazuje, jak uložit obsah RichTextBox souboru, načíst tento obsah zpět do RichTextBoxa vytisknout obsah. Níže je uveden kód pro příklad.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.SaveLoadPrintRTB" >

  <StackPanel>
    <RichTextBox Name="richTB">
      <FlowDocument>
        <Paragraph>
          <Run>Paragraph 1</Run>
        </Paragraph>
      </FlowDocument>
    </RichTextBox>

    <Button Click="SaveRTBContent">Save RTB Content</Button>
    <Button Click="LoadRTBContent">Load RTB Content</Button>
    <Button Click="PrintRTBContent">Print RTB Content</Button>
  </StackPanel>

</Page>

Níže je uvedený kód pro příklad.

using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;

namespace SDKSample
{

    public partial class SaveLoadPrintRTB : Page
    {

        // Handle "Save RichTextBox Content" button click.
        void SaveRTBContent(Object sender, RoutedEventArgs args)
        {

            // Send an arbitrary URL and file name string specifying
            // the location to save the XAML in.
            SaveXamlPackage("C:\\test.xaml");
        }

        // Handle "Load RichTextBox Content" button click.
        void LoadRTBContent(Object sender, RoutedEventArgs args)
        {
            // Send URL string specifying what file to retrieve XAML
            // from to load into the RichTextBox.
            LoadXamlPackage("C:\\test.xaml");
        }

        // Handle "Print RichTextBox Content" button click.
        void PrintRTBContent(Object sender, RoutedEventArgs args)
        {
            PrintCommand();
        }

        // Save XAML in RichTextBox to a file specified by _fileName
        void SaveXamlPackage(string _fileName)
        {
            TextRange range;
            FileStream fStream;
            range = new TextRange(richTB.Document.ContentStart, richTB.Document.ContentEnd);
            fStream = new FileStream(_fileName, FileMode.Create);
            range.Save(fStream, DataFormats.XamlPackage);
            fStream.Close();
        }

        // Load XAML into RichTextBox from a file specified by _fileName
        void LoadXamlPackage(string _fileName)
        {
            TextRange range;
            FileStream fStream;
            if (File.Exists(_fileName))
            {
                range = new TextRange(richTB.Document.ContentStart, richTB.Document.ContentEnd);
                fStream = new FileStream(_fileName, FileMode.OpenOrCreate);
                range.Load(fStream, DataFormats.XamlPackage);
                fStream.Close();
            }
        }

        // Print RichTextBox content
        private void PrintCommand()
        {
            PrintDialog pd = new PrintDialog();
            if ((pd.ShowDialog() == true))
            {
                //use either one of the below
                pd.PrintVisual(richTB as Visual, "printing as visual");
                pd.PrintDocument((((IDocumentPaginatorSource)richTB.Document).DocumentPaginator), "printing as paginator");
            }
        }
    }
}

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

Namespace SDKSample

    Partial Public Class SaveLoadPrintRTB
        Inherits Page

        ' Handle "Save RichTextBox Content" button click.
        Private Sub SaveRTBContent(ByVal sender As Object, ByVal args As RoutedEventArgs)

            ' Send an arbitrary URL and file name string specifying
            ' the location to save the XAML in.
            SaveXamlPackage("C:\test.xaml")
        End Sub

        ' Handle "Load RichTextBox Content" button click.
        Private Sub LoadRTBContent(ByVal sender As Object, ByVal args As RoutedEventArgs)
            ' Send URL string specifying what file to retrieve XAML
            ' from to load into the RichTextBox.
            LoadXamlPackage("C:\test.xaml")
        End Sub

        ' Handle "Print RichTextBox Content" button click.
        Private Sub PrintRTBContent(ByVal sender As Object, ByVal args As RoutedEventArgs)
            PrintCommand()
        End Sub

        ' Save XAML in RichTextBox to a file specified by _fileName
        Private Sub SaveXamlPackage(ByVal _fileName As String)
            Dim range As TextRange
            Dim fStream As FileStream
            range = New TextRange(richTB.Document.ContentStart, richTB.Document.ContentEnd)
            fStream = New FileStream(_fileName, FileMode.Create)
            range.Save(fStream, DataFormats.XamlPackage)
            fStream.Close()
        End Sub

        ' Load XAML into RichTextBox from a file specified by _fileName
        Private Sub LoadXamlPackage(ByVal _fileName As String)
            Dim range As TextRange
            Dim fStream As FileStream
            If File.Exists(_fileName) Then
                range = New TextRange(richTB.Document.ContentStart, richTB.Document.ContentEnd)
                fStream = New FileStream(_fileName, FileMode.OpenOrCreate)
                range.Load(fStream, DataFormats.XamlPackage)
                fStream.Close()
            End If
        End Sub

        ' Print RichTextBox content
        Private Sub PrintCommand()
            Dim pd As New PrintDialog()
            If (pd.ShowDialog() = True) Then
                'use either one of the below      
                pd.PrintVisual(TryCast(richTB, Visual), "printing as visual")
                pd.PrintDocument(((CType(richTB.Document, IDocumentPaginatorSource)).DocumentPaginator), "printing as paginator")
            End If
        End Sub
    End Class
End Namespace

Viz také