如何将 BlockUIContainer 中 RichTextBox 的内容保存到 RTF 文件?

Posted

技术标签:

【中文标题】如何将 BlockUIContainer 中 RichTextBox 的内容保存到 RTF 文件?【英文标题】:How to save content of RichTextBox in BlockUIContainer, to RTF file? 【发布时间】:2014-03-22 05:51:51 【问题描述】:

我使用 BlockUIContainer 制作了两个 Richtexbox,一个小的 Richtexbox 嵌套在一个大的 Richtextbox 中,请参见下面的 XAML 文件。

    <RichTextBox IsDocumentEnabled="True"  x:Name="first" HorizontalAlignment="Left" Height="174" Margin="120,136,0,0" VerticalAlignment="Top" Width="254" TextChanged="first_TextChanged" MouseDoubleClick="first_MouseDoubleClick">
        <FlowDocument>
            <Paragraph>
                <Run Text="RichTextBox"/>
            </Paragraph>
            <BlockUIContainer>
                <RichTextBox IsReadOnly="True" x:Name="second"  MouseDoubleClick="second_MouseDoubleClick" Width="239" TextChanged="second_TextChanged">
                    <FlowDocument>
                        <Paragraph>
                            <Run Text="RichTextBox1"/>
                            <Run Language="en" Text="hh"/>
                        </Paragraph>
                    </FlowDocument>
                </RichTextBox>
            </BlockUIContainer>
        </FlowDocument>
    </RichTextBox>

我希望将两个 Richtexbox 的内容保存在 RTF 文件中。通常我们可以使用TextRange(richTextBox.Document.ContentStart,richTextBox.Document.ContentEnd),因为现在我们已经嵌套了richtexbox,所以我认为TextRange可能不起作用。也许我会在richtextbox中添加一些图像,所以我想尝试二进制流,见下文。 “第一”是大富文本框的名称。 THE PATH 是 RTF 文件的路径。

FlowDocument document = first.Document;
System.IO.Stream ms = new System.IO.MemoryStream();
System.Windows.Markup.XamlWriter.Save(document, ms);
byte[] data = new byte[ms.Length];
ms.Position = 0;
ms.Read(data, 0, data.Length);
ms.Close();
File.WriteAllBytes(THE PATH, data);

但是在保存的 RTF 文件中,当我打开它时,它显示为这样,

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Paragraph>RichTextBox</Paragraph><Paragraph><Run xml:lang="en">test test test!!!</Run></Paragraph><BlockUIContainer><RichTextBox IsReadOnly="True" Name="second" Width="239"><FlowDocument PagePadding="5,0,5,0" AllowDrop="True"><Paragraph>RichTextBox1<Run xml:space="preserve"> </Run><Run xml:lang="en">hhthis is a small richtextbox</Run></Paragraph><Paragraph><Run xml:lang="en" xml:space="preserve" /></Paragraph></FlowDocument></RichTextBox></BlockUIContainer></FlowDocument>

我不想在保存的文件中看到 XAML 纯文本,我希望它像普通的 Word 文档一样显示,见下文。并且可能还看到了小richtextbox的边框线(这个边框线没有在下面显示)

RichTextBox
test test test!!!
RichTextBox1 hhthis is a small richtextbox

我该怎么办?还是 BlockUIContainer 嵌套的 Richtextbox 不能这样显示?

【问题讨论】:

【参考方案1】:

您可以通过保存它并指定格式来做到这一点。我省略了不必要的代码,但只需将 memorystream 替换为您当前拥有的即可。

richTextBox.SelectAll();
richTextBox.Selection.Save(new MemoryStream(), DataFormats.Rtf);

XamlWriter 会将其保存为 XAML 格式

【讨论】:

谢谢lll,通过使用DataFormats.Rtf,大richtextbox的文本显示在文件中,但小richtextbox完全消失了。我在想这种方式可能无法处理 BlockUIContainer 中的内容... XamlWriter 可以将内容保存在 BlockUIContainer 中,但我不知道如何使流正确显示在保存的文件中... 为什么不抓取 Richtextbox 的文档,获取块然后删除 BlockUIContainer 并将其读入 Flowdocument

以上是关于如何将 BlockUIContainer 中 RichTextBox 的内容保存到 RTF 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Adjusted rand index(ARI)优于rand index(RI)以及如何从公式中直观理解ARI

如何将日期分配给defaultDate?

我如何在JRuby中安装ri文档?

如何使 --no-ri --no-rdoc 成为 gem 安装的默认值? [复制]

将 78 个特定代码从创建的表连接到链接表。不能使用 IN() 函数(字符限制),不能做 RI

如何在单个查询中使用索引进行多表连接?