RichTextBox'a Genel Bakış

RichTextBox denetimi paragraflar, resimler, tablolar ve daha fazlası dahil olmak üzere akış içeriğini görüntülemenizi veya düzenlemenizi sağlar. Bu konu, TextBox sınıfını tanıtır ve hem Genişletilebilir Uygulama Biçimlendirme Dili (XAML) hem de C# dilinde nasıl kullanılacağına ilişkin örnekler sağlar.

TextBox mı yoksa RichTextBox mı?

Hem RichTextBox hem de TextBox kullanıcıların metin düzenlemesine olanak sağlar, ancak iki denetim farklı senaryolarda kullanılır. RichTextBox, kullanıcının biçimlendirilmiş metinleri, resimleri, tabloları veya diğer zengin içerikleri düzenlemesi gerektiğinde daha iyi bir seçimdir. Örneğin, biçimlendirme, resim vb. gerektiren bir belgeyi, makaleyi veya blogu düzenlemek en iyi RichTextBoxkullanılarak gerçekleştirilir. TextBox, RichTextBox'den daha az sistem kaynağı gerektirir ve yalnızca düz metin düzenlenmesi gerektiğinde (örn. formlarda kullanım) idealdir. TextBoxhakkında daha fazla bilgi için bkz. TextBox'a Genel Bakış. Aşağıdaki tabloda TextBox ve RichTextBoxana özellikleri özetlenmiştir.

Kontrol Gerçek Zamanlı Yazım Denetimi Bağlam Menüsü ToggleBold (Ctr+B) gibi biçimlendirme komutları FlowDocument gibi içerikler; resimler, paragraflar, tablolar vb.
TextBox Evet Evet Hayır Hayır.
RichTextBox Evet Evet Evet Evet

Not

TextBox ToggleBold (Ctr+B) gibi biçimlendirmeyle ilgili komutları desteklemese de, MoveToLineEndgibi her iki denetimde de birçok temel komut desteklenir.

Yukarıdaki tabloda yer alan özellikler daha sonra daha ayrıntılı olarak ele alınmıştır.

RichTextBox Oluşturma

Aşağıdaki kod, bir kullanıcının zengin içeriği düzenleyebileceği bir RichTextBox nasıl oluşturulacağını gösterir.

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

Özellikle, RichTextBox'da düzenlenmiş içerik akış içeridir. Akış içeriği biçimlendirilmiş metin, resimler, listeler ve tablolar gibi birçok öğe türünü içerebilir. Akış belgeleri hakkında ayrıntılı bilgi için bkz. Flow Belgesine Genel Bakış. Akış içeriği içermesi için, RichTextBox düzenlenebilir içeriği içeren bir FlowDocument nesnesi barındırıyor. Akış içeriğini bir RichTextBoxiçinde göstermek için, aşağıdaki kod, bir paragraf ve bazı kalın metin içeren bir RichTextBox'in nasıl oluşturulacağını göstermektedir.

<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

Aşağıdaki çizim, bu örneğin nasıl işlediğini göstermektedir.

İçerik ile RichTextBox

Paragraph ve Bold gibi öğeler, bir RichTextBox içindeki içeriğin nasıl görüneceğini belirler. Kullanıcı RichTextBox içeriği düzenledikçe bu akış içeriğini değiştirir. Akış içeriğinin özellikleri ve bu içerikle çalışma hakkında daha fazla bilgi edinmek için bkz. Flow Belgesine Genel Bakış.

Not

RichTextBox içindeki akış içeriği, diğer denetimlerde yer alan akış içeriği gibi davranmaz. Örneğin, RichTextBox'da sütunlar yoktur ve bu nedenle otomatik yeniden boyutlandırma davranışları da yoktur. Ayrıca, arama, görüntüleme modu, sayfa gezintisi ve yakınlaştırma gibi yerleşik özellikler bir RichTextBoxiçinde kullanılamaz.

Gerçek Zamanlı Yazım Denetimi

Gerçek zamanlı yazım denetimini bir TextBox veya RichTextBox'de etkinleştirebilirsiniz. Yazım denetimi açıkken, yanlış yazılmış sözcüklerin altında kırmızı bir çizgi görünür (aşağıdaki resme bakın).

Yazım denetimi ile Metin Kutusu

Yazım denetimini etkinleştirmeyi öğrenmek için bkz. Metin Düzenleme Denetiminde Yazım Denetimini Etkinleştirme .

Bağlam Menüsü

Varsayılan olarak, hem TextBox hem de RichTextBox, kullanıcı denetimin içine sağ tıkladığında görüntülenen bir bağlam menüsüne sahiptir. Bağlam menüsü kullanıcının kesmesine, kopyalamasına veya yapıştırmasına olanak tanır (aşağıdaki çizime bakın).

Bağlam menüsü ile TextBox

Varsayılan menüyü geçersiz kılmak için kendi özel bağlam menünüzü oluşturabilirsiniz. Daha fazla bilgi için bkz. RichTextBox Özel Bağlam Menüsünü Konumlandırma.

Komutları Düzenleme

Düzenleme komutları, kullanıcıların bir RichTextBoxiçinde düzenlenebilir içeriği biçimlendirmesini sağlar. Temel düzenleme komutlarının yanı sıra, RichTextBoxTextBox desteklemeyen biçimlendirme komutlarını içerir. Örneğin, bir RichTextBoxdüzenlerken, kullanıcı kalın metin biçimlendirmesini değiştirmek için Ctr+B tuşlarına basabilir. Kullanılabilir komutların tam listesi için bkz. EditingCommands. Klavye kısayollarını kullanmaya ek olarak, komutları düğmeler gibi diğer denetimlere bağlayabilirsiniz. Aşağıdaki örnekte, kullanıcının metin biçimlendirmesini değiştirmek için kullanabileceği düğmeleri içeren basit bir araç çubuğunun nasıl oluşturulacağı gösterilmektedir.

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

Aşağıdaki çizimde bu örneğin nasıl görüntülediği gösterilmektedir.

Araç Çubuğu ile birlikte RichTextBox

İçerik Değiştiğinde Algılamak

Genellikle TextChanged olayı, TextBox veya RichTextBox metni her değiştiğinde, beklediğiniz gibi KeyDown yerine algılamak için kullanılmalıdır. Bir örnek için bkz. TextBox'taki Metnin Ne Zaman Değiştiğini Algılama.

RichTextBox İçeriğini Kaydetme, Yükleme ve Yazdırma

Aşağıdaki örnek, bir RichTextBox içeriğinin bir dosyaya nasıl kaydedildiğini, bu içeriğin RichTextBoxgeri yüklendiğini ve içeriğin nasıl yazdırılacağını gösterir. Aşağıda, örneğin biçimlendirmesi verilmiştir.

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

Aşağıda, örneğin arkasındaki kod verilmiştir.

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

Ayrıca bkz.