WPF中文网

RichTextBox富文本框 

RichTextBox继承于TextBoxBase基类,所以很大程度上与TextBox控件类似,两者在某些情况下可以互相替换。但是,如果要为用户提供更强大的文档编辑功能,非RichTextBox莫属。在学习这个控件之前,请参阅FlowDocument(流文档)一节。

首先,我们来看看RichTextBox的结构定义:

public class RichTextBox : TextBoxBase, IAddChild
{
    public static readonly DependencyProperty IsDocumentEnabledProperty;

    public RichTextBox();
    public RichTextBox(FlowDocument document);

    public FlowDocument Document { get; set; }
    public bool IsDocumentEnabled { get; set; }
    public TextSelection Selection { get; }
    public TextPointer CaretPosition { get; set; }
    protected internal override IEnumerator LogicalChildren { get; }

    public TextPointer GetNextSpellingErrorPosition(TextPointer position, LogicalDirection direction);
    public TextPointer GetPositionFromPoint(Point point, bool snapToText);
    public SpellingError GetSpellingError(TextPointer position);
    public TextRange GetSpellingErrorRange(TextPointer position);
    public bool ShouldSerializeDocument();
    protected override Size MeasureOverride(Size constraint);
    protected override AutomationPeer OnCreateAutomationPeer();
    protected override void OnDpiChanged(DpiScale oldDpiScaleInfo, DpiScale newDpiScaleInfo);

}

RichTextBox控件有一个带参数的构造函数,参数的类型是FlowDocument类,另外,它还有一个Document属性,类型也是FlowDocument类,说明RichTextBox控件的元素必须且只能是FlowDocument类,如果您试图将RichTextBox.Document=null,会发现它会报错。

我们假定您对FlowDocument类有一定的了解,所以,我们直接看一下示例。

前端代码

<Window x:Class="HelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HelloWorld"
        mc:Ignorable="d" FontSize="16"
        Title="HelloWorld - www.wpfsoft.com" Height="360" Width="500">
    <StackPanel>
        <RichTextBox x:Name="_richTextBox" Margin="10 5" Height="270">
            <FlowDocument>
                <Paragraph>RichTextBox富文本框控件到底有什么强大的功能?
                    <Bold Foreground="DarkRed">请看下面.</Bold>
                </Paragraph>
                <Paragraph Foreground="Blue">RichTextBox唯一的子元素是FlowDocument</Paragraph>
                <Paragraph Foreground="DarkGreen">
                    FlowDocument是指流文档,一个流文档由一个或多个Block构成,
                    所以它有一个Blocks属性。Block只是一个抽象基类,
                    所以流文档的子元素其实是继承了Block的子类,例如:
                </Paragraph>
                <List MarkerOffset="25" MarkerStyle="Decimal"  StartIndex="1">
                    <ListItem>
                        <Paragraph>BlockUIContainer(UI元素容器)</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>List(有序列表)</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>Paragraph(段落)</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>Section(分组)</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>Table(网格)</Paragraph>
                    </ListItem>
                </List>
            </FlowDocument>
        </RichTextBox>
        <Button x:Name="_button" Content="确定" Margin="10,5" Click="_button_Click"/>
    </StackPanel>
</Window>

后端代码

namespace HelloWorld
{
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

        private void _button_Click(object sender, RoutedEventArgs e)
        {
            TextRange textRange = new TextRange(_richTextBox.Document.ContentStart, _richTextBox.Document.ContentEnd);
            MessageBox.Show(textRange.Text);

            Paragraph paragraph = new Paragraph();
            Run run = new Run($"当前时间:{DateTime.Now}"); //手动加换行
            run.Foreground = Brushes.Black;
            paragraph.Inlines.Add(run);
            _richTextBox.Document.Blocks.Add(paragraph);
        }
    }
}

如上所示,我们在窗体中实例化了一个RichTextBox控件,并实例化了一个FlowDocument对象。RichTextBox唯一的子元素是FlowDocument,

FlowDocument是指流文档,一个流文档由一个或多个Block构成,所以它有一个Blocks属性。Block只是一个抽象基类,FlowDocument流文档的子元素都继承了Block抽象基类,例如:

  • BlockUIContainer(UI元素容器)
  • List(有序列表)
  • Paragraph(段落)
  • Section(分组)
  • Table(网格)

BlockUIContainer是一个非常强大的段落元素,因为它可以直接包含WPF的控件。这样一来,我们就可以将设计的UI写入到流文档中显示或打印。

上面这五个元素继承了TextElement、FrameworkContentElement和ContentElement三个父素,所以实际上这五个子元素就拥有了许多字体属性的设置、资源、样式、数据绑定、以及各种事件的应用。

如果要获取RichTextBox的文本信息,可以使用TextRange类。FlowDocument类有两个属性,分别ContentStart和ContentEnd,表示文字内容的开始和结束。

所以通过TextRange类的Text,我们就能访问到RichTextBox控件的内容。

当前课程源码下载:(注明:本站所有源代码请按标题搜索)

文件名:024-《RichTextBox文本框》-源代码
链接:https://pan.baidu.com/s/1yu-q4tUtl0poLVgmcMfgBA
提取码:wpff

——重庆教主 2023年8月28日

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1