gpt4 book ai didi

c# - 如何将一个 FlowDocument 中的内联内容插入到另一个 FlowDocument 中?

转载 作者:可可西里 更新时间:2023-11-01 09:05:53 25 4
gpt4 key购买 nike

我正在构建一个应用程序,该应用程序需要允许用户将来自一个 RichTextBox 的文本插入到另一个的当前插入符位置。在运行此技术之前,我花了 很多 时间来研究 FlowDocument 的对象模型 - sourcetarget 都是 FlowDocument:

using (MemoryStream ms = new MemoryStream())
{
TextRange tr = new TextRange(source.ContentStart, source.ContentEnd);
tr.Save(ms, DataFormats.Xaml);
ms.Seek(0, SeekOrigin.Begin);
tr = new TextRange(target.CaretPosition, target.CaretPosition);
tr.Load(ms, DataFormats.Xaml);
}

这非常有效。

我现在遇到的唯一问题是它总是将源作为新段落插入。它在插入符号处中断当前运行(或其他),插入源代码,并结束段落。如果源实际上是一个段落(或多个段落),这是合适的,但如果它只是(比方说)一行文本,则不合适。

我认为这个问题的答案很可能最终会检查目标以查看它是否完全由一个 block 组成,如果是,则将 TextRange 设置为指向将 block 内容保存到流之前的开始和结束。

FlowDocument 的整个世界对我来说是一片黑暗神秘的翻腾海洋。如果必须的话,我可以成为这方面的专家(根据陀思妥耶夫斯基的说法:“人是可以适应任何事物的动物。”),但是如果有人已经弄清楚了这一点并且可以告诉我该怎么做,那将使我生活轻松多了。

最佳答案

您的直接问题是您使用的是 TextFormat.Xaml 而不是 TextFormat.XamlPackage

控制合并文档时是否合并行的属性是 Section.HasTrailingParagraphBreakOnPaste 属性。此属性仅在加载或保存 XamlPackage 文本格式时有效。当改用 Xaml 文本格式时,该属性在 Save() 期间被忽略,而在 Load() 期间被忽略。

所以简单的解决方法是简单地更改加载和保存调用:

tr.Save(ms, DataFormats.XamlPackage); 
ms.Seek(0, SeekOrigin.Begin);
tr = new TextRange(target.CaretPosition, target.CaretPosition);
tr.Load(ms, DataFormats.XamlPackage);

请注意,这也解决了您最终会遇到的另一个问题:使用 DataFormats.Xaml 时,嵌入的位图不会被正确复制,因为没有地方可以放置图像位。使用 DataFormats.XamlPackage 构建了一个完整的包,因此位图和其他包项将正常显示。

进行此更改后,您可能会发现另一个事实,这对您来说可能是问题,也可能不是问题:您的示例代码使用 document.ContentStartdocument.ContentEnd。如果这是您的实际代码,您会发现从 document.ContentStartdocument.ContentEnd 的任何范围都必须包含完整的段落,因此复制它总是会在插入结束。如果这是一个问题,请使用类似 RichTextBox.Selection 的东西(如果这是 UI 驱动的)或使用 TextPointerContentEnd 备份到隐式段落标记,例如:

var tr = new TextRange(document.ContentStart,
document.ContentEnd.GetInsertionPosition(
LogicalDirection.Backward));

关于c# - 如何将一个 FlowDocument 中的内联内容插入到另一个 FlowDocument 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com