如何在不丢失WPF C#格式的情况下将textrange附加到流文档

时间:2018-11-16 07:18:36

标签: c# wpf richtextbox textrange

我需要添加TextRrange来流式传输文档,而又不丢失在RichTextBox中对其进行的格式化。 我收到RichTextBox.Text并将其转换为字符串并丢失所有格式,但是我不想放弃从富文本框中读取的文本的格式。

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



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

1 个答案:

答案 0 :(得分:0)

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

MainWindow.xaml

TextRange

MainWindow.xaml.cs

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

由于数据格式设置为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 不仅可以包含格式化文本,还可以包含表格或图像,并且会以保留格式进行复制。< /p>