RichTextBox 在将其绑定到 FlowDocumentReader 内部的内容时变为只读

问题描述

问题:在以下代码btnRevert_Click(...) 事件中,我们如何使 RichTextBox 可编辑?

在我的 WPF .NET5 应用程序中,btnTest_Click(...) 事件成功地将 RichTextBox内容显示flowdocumentreader (fdreader) 中。然后 btnRevert_Click(...) 事件成功地从 fdreader 取回内容并将其显示RichTextBox,但它使 RichTextBox ReadOnly

我通过在 RichTextBox 中输入简单文本“This is a test”来测试该场景,并注意到上述来回场景工作正常,只是 btnRevert_Click(...) 事件使文本“This is a test”只读.

MainWindow.xaml

<Window x:Class="Wpf_RTBFlowDocTest.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:Wpf_RTBFlowDocTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DockPanel Name="mainPanel">
            <ToolBar Name="mainToolBar" Height="30" DockPanel.Dock="Top">
                <Button x:Name="btnTest" Content="Test" Click="btnTest_Click"/>
                <Button x:Name="btnRevert" Content="Revert" Click="btnRevert_Click"/>
            </ToolBar>
            <RichTextBox Name="rtbTest" AcceptsTab="True"></RichTextBox>
            <flowdocumentreader x:Name="fdreader" Visibility="Collapsed">
                <FlowDocument>
                    <Paragraph>Text inside paragraph.</Paragraph>
                </FlowDocument>
            </flowdocumentreader>
        </DockPanel>
    </Grid>
</Window>

MainWindow.xaml.cs

private void btnTest_Click(object sender,RoutedEventArgs e)
{
    FlowDocument RTBflowDoc = rtbTest.Document;
    rtbTest.Visibility = Visibility.Collapsed;
    rtbTest.Document = new FlowDocument();
    fdreader.Document = RTBflowDoc;
    fdreader.Visibility = Visibility.Visible;
}

private void btnRevert_Click(object sender,RoutedEventArgs e)
{
    FlowDocument fdreaderFlowDoc = fdreader.Document;
    fdreader.Document = new FlowDocument();
    rtbTest.IsReadOnly = false;
    rtbTest.Document = fdreaderFlowDoc;
    rtbTest.Visibility = Visibility.Visible;
}

解决方法

FlowDocumentReader 提供查看流内容的控件(不支持编辑)。

btnRevert_Click() 方法中的以下几行,来自上面的问题,只需将 rtbTest.Document 设置为 fdReader.Document

FlowDocument fdReaderFlowDoc = fdReader.Document;
fdReader.Document = new FlowDocument();  
rtbTest.Document = fdReaderFlowDoc;

但是由于FlowDocument控件中的FlowDocumentReader不支持编辑,从FlowDocumentReader控件中获取文档进行编辑的最简单方法是克隆它,如下所示:

private void btnRevert_Click(object sender,RoutedEventArgs e)
{   
    var range = new TextRange(fdReader.Document.ContentStart,fdReader.Document.ContentEnd);
    if (!range.IsEmpty)
    {
        using (var stream = new MemoryStream())
        {
            range.Save(stream,DataFormats.XamlPackage);
            var copyto = new TextRange(rtbTest.Document.ContentEnd,rtbTest.Document.ContentEnd);
            copyto.Load(stream,DataFormats.XamlPackage);
        }
    }
    rtbTest.Visibility = Visibility.Visible;
    fdReader.Visibility = Visibility.Collapsed;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...