Общие сведения о RichTextBoxRichTextBox Overview

RichTextBoxЭлемент управления позволяет отображать или редактировать содержимое нефиксированного формата, включая абзацы, изображения, таблицы и т. д.The RichTextBox control enables you to display or edit flow content including paragraphs, images, tables, and more. В этом разделе описывается TextBox класс и приводятся примеры его использования в и в Язык XAMLExtensible Application Markup Language (XAML) C#.This topic introduces the TextBox class and provides examples of how to use it in both Язык XAMLExtensible Application Markup Language (XAML) and C#.

TextBox или RichTextBox?TextBox or RichTextBox?

RichTextBoxИ, и TextBox позволяют пользователям редактировать текст, однако эти два элемента управления используются в различных сценариях.Both RichTextBox and TextBox allow users to edit text, however, the two controls are used in different scenarios. Является RichTextBox лучшим выбором, когда необходимо, чтобы пользователь изменяю форматированный текст, изображения, таблицы или другое насыщенное содержимое.A RichTextBox is a better choice when it is necessary for the user to edit formatted text, images, tables, or other rich content. Например, изменение документа, статьи или блога, для которого требуется форматирование, изображения и т. д., лучше всего выполнять с помощью RichTextBox .For example, editing a document, article, or blog that requires formatting, images, etc is best accomplished using a RichTextBox. А TextBox требует меньше системных ресурсов, RichTextBox а и идеально подходит, когда требуется редактировать только обычный текст (т. е. использование в формах).A TextBox requires less system resources then a RichTextBox and it is ideal when only plain text needs to be edited (i.e. usage in forms). Дополнительные сведения о см. в разделе Обзор текстового поля TextBox .See TextBox Overview for more information on TextBox. В следующей таблице перечислены основные возможности TextBox и RichTextBox .The table below summarizes the main features of TextBox and RichTextBox.

ControlControl Проверка орфографии в режиме реального времениReal-time Spellchecking Контекстное менюContext Menu Команды форматирования, например ToggleBold (Ctrl + B)Formatting commands like ToggleBold (Ctr+B) FlowDocument содержимое, например изображения, абзацы, таблицы и т. д.FlowDocument content like images, paragraphs, tables, etc.
TextBox ДаYes ДаYes НетNo Нет.No.
RichTextBox ДаYes ДаYes ДаYes ДаYes

Примечание

Хотя не TextBox поддерживает такие команды форматирования, как ToggleBold (Ctrl + B), многие основные команды поддерживаются обоими элементами управления, такими как MoveToLineEnd .Although TextBox does not support formatting related commands like ToggleBold (Ctr+B), many basic commands are supported by both controls such as MoveToLineEnd.

Функции из приведенной выше таблицы будут подробно рассматриваться далее.The features from the table above are covered in more detail later.

Создание элемента управления RichTextBoxCreating a RichTextBox

В приведенном ниже коде показано, как создать объект RichTextBox , который пользователь может редактировать с содержимым в.The code below shows how to create a RichTextBox that a user can edit rich content in.

<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>

В частности, содержимое, измененное в, RichTextBox является нефиксированным содержимым.Specifically, the content edited in a RichTextBox is flow content. Содержимое нефиксированного формата может включать множество типов элементов, в том числе форматированный текст, изображения, списки и таблицы.Flow content can contain many types of elements including formatted text, images, lists, and tables. См. более подробные сведения о потоковых документах в разделе Общие сведения о потоковых документах.See Flow Document Overview for in depth information on flow documents. Чтобы вместить содержимое нефиксированного формата, объект RichTextBox размещается в FlowDocument объекте, который, в свою очередь, содержит редактируемое содержимое.In order to contain flow content, a RichTextBox hosts a FlowDocument object which in turn contains the editable content. Чтобы продемонстрировать содержимое нефиксированного формата в RichTextBox , в следующем коде показано, как создать объект RichTextBox с абзацем и полужирным текстом.To demonstrate flow content in a RichTextBox, the following code shows how to create a RichTextBox with a paragraph and some bolded text.

<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

На рисунке ниже показано, как будет выглядеть этот пример.The following illustration shows how this sample renders.

RichTextBox с содержимымRichTextBox with content

Элементы, такие как Paragraph и, Bold определяют, как RichTextBox отображается содержимое внутри.Elements like Paragraph and Bold determine how the content inside a RichTextBox appears. Когда пользователь редактирует RichTextBox содержимое, он изменяет содержимое нефиксированного формата.As a user edits RichTextBox content, they change this flow content. Дополнительные сведения о возможностях подвижного содержимого и способах работы с ним см. в разделе Общие сведения о потоковых документах.To learn more about the features of flow content and how to work with it, see Flow Document Overview.

Примечание

Содержимое нефиксированного формата внутри не работает точно так же, RichTextBox как и содержимое потока, содержащееся в других элементах управления.Flow content inside a RichTextBox does not behave exactly like flow content contained in other controls. Например, отсутствуют столбцы в и, следовательно, RichTextBox Автоматическое изменение размера не выполняется.For example, there are no columns in a RichTextBox and hence no automatic resizing behavior. Кроме того, встроенные функции, такие как поиск, режим просмотра, Навигация по страницам и масштаб, недоступны в RichTextBox .Also, built in features like search, viewing mode, page navigation, and zoom are not available within a RichTextBox.

Проверка орфографии в режиме реального времениReal-time Spell Checking

Проверку орфографии в режиме реального времени можно включить в TextBox или RichTextBox .You can enable real-time spell checking in a TextBox or RichTextBox. При включенной проверке орфографии все слова с ошибками подчеркиваются красной линией (см. рисунок ниже).When spellchecking is turned on, a red line appears underneath any misspelled words (see picture below).

Текстовое поле с проверкой орфографии-Textbox with spell-checking

Чтобы научиться включать проверку правописания, см. раздел Включение проверки орфографии в элементе управления редактирования текста.See Enable Spell Checking in a Text Editing Control to learn how to enable spellchecking.

Контекстное менюContext Menu

По умолчанию TextBox и, и RichTextBox имеют контекстное меню, отображаемое, когда пользователь щелкает правой кнопкой мыши внутри элемента управления.By default, both TextBox and RichTextBox have a context menu that appears when a user right-clicks inside the control. Контекстное меню дает пользователю возможность вырезания, копирования и вставки (см. рисунок ниже).The context menu allows the user to cut, copy, or paste (see illustration below).

TextBox с контекстным менюTextBox with context menu

Можно создать собственное пользовательское контекстное меню, чтобы переопределить меню по умолчанию.You can create your own custom context menu to override the default one. Дополнительные сведения см. в разделе Расположение пользовательского контекстного меню в RichTextBox.See Position a Custom Context Menu in a RichTextBox for more information.

Команды измененияEditing Commands

Команды редактирования позволяют пользователям форматировать содержимое, доступное для редактирования, в RichTextBox .Editing commands enable users to format editable content inside a RichTextBox. Помимо основных команд редактирования RichTextBox включает команды форматирования, которые TextBox не поддерживаются.Besides basic editing commands, RichTextBox includes formatting commands that TextBox does not support. Например, при редактировании в RichTextBox пользователь может нажать сочетание клавиш CTRL + B, чтобы включить форматирование текста полужирным шрифтом.For example, when editing in a RichTextBox, a user could press Ctr+B to toggle bold text formatting. EditingCommandsПолный список доступных команд см. в разделе.See EditingCommands for a complete list of commands available. Помимо использования сочетания клавиш, можно подключать команды к другим элементам управления, таким как кнопки.In addition to using keyboard shortcuts, you can hook commands up to other controls like buttons. В следующем примере показано, как создать простую панель инструментов, содержащую кнопки, с помощью которых пользователь может изменять форматирование текста.The following example shows how to create a simple tool bar containing buttons that the user can use to change text formatting.

<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>

На следующем рисунке показано, как будет выглядеть этот пример.The following illustration shows how this sample displays.

RichTextBox с панелью инструментовRichTextBox with ToolBar

Определение изменения содержимогоDetect when Content Changes

Обычно TextChanged событие следует использовать для обнаружения изменений текста в или, а не в том виде, в TextBox RichTextBox KeyDown котором они могут ожидать.Usually the TextChanged event should be used to detect whenever the text in a TextBox or RichTextBox changes rather then KeyDown as you might expect. Пример см. в разделе Определение изменения текста в TextBox.See Detect When Text in a TextBox Has Changed for an example.

Сохранение, загрузка и печать содержимого RichTextBoxSave, Load, and Print RichTextBox Content

В следующем примере показано, как сохранить содержимое в RichTextBox файл, загрузить содержимое обратно в RichTextBox и распечатать содержимое.The following example shows how to save content of a RichTextBox to a file, load that content back into the RichTextBox, and print the contents. Ниже для примера приведена разметка.Below is the markup for the example.

<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>

Ниже для примера приведен код.Below is the code behind for the example.

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

См. такжеSee also