0

我需要添加TextRange到流文档,而不会丢失在RichTextBox. 我正在将RichTextBox.Text其转换为字符串并丢失所有格式,但我不想丢失从RichTextBox.

TextRange t = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
String s = t.Text;

FlowDocument fd = new FlowDocument();
  /*
    this snippet works but looses formatting
    Paragraph p = new Paragraph();
    p.Inlines.Add(s);
    fd.Blocks.Add(p);
  */
fd.Blocks.Add(t); // cannot convert TextRange to Block
4

1 回答 1

0

最简单的方法是将所需的内容复制到内存块,然后使用该方法TextRange将其附加到末尾或将其加载到另一个. 使用内存块就像复制到剪贴板一样,因此不存在性能问题:FlowDocumentTextRange.Load()TextRange

MainWindow.xaml

<Window ...
        Title="MainWindow" Height="350" Width="400">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>            
        </Grid.RowDefinitions>

        <RichTextBox x:Name="rtb" Margin="5">
            <FlowDocument>
                <Paragraph>
                    <Run>Paste some formatted document to here for testing...</Run>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
        
        <Button Grid.Row="1" Click="Copy_Click">Copy Selection</Button>
    </Grid>
</Window>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Copy_Click(object sender, RoutedEventArgs e)
    {
        var range = rtb.Selection;
        if (!range.IsEmpty)
        {
            using (var stream = new MemoryStream())
            {
                range.Save(stream, DataFormats.XamlPackage);
                var copyto = new TextRange(rtb.Document.ContentEnd, rtb.Document.ContentEnd);
                copyto.Load(stream, DataFormats.XamlPackage);
            }
        }
    }
}

由于数据格式设置为DataFormats.XamlPackage不仅TextRange可以包含格式化的文本,还可以包含表格或图像,并且将在保留格式的情况下进行复制。

于 2021-04-11T15:27:03.210 回答