0

我有一个可编辑的 RichTextBox,用户可以在其中添加表格、段落、超链接、图像等。当用户插入图像时,我的程序会从选定位置创建图片副本到应用程序的目标目录,并在 Image 对象中设置这个新源。

现在用户可以从 RichTextBox 中删除图像。在这种情况下,应用程序还应该从其目录中删除图像文件。当删除任何内容时,我试图找到 FlowDocument 中发生的任何事件。我没有发现这样的事件。

或者,我决定使用 Image 对象的 Unloaded 事件。当图像被删除时,Unloaded 事件被适当地触发(有时两次)并且我删除文件的代码有效。现在的问题是 RichTextBox 被放置在 TabItem 中。如果我切换到另一个选项卡项,Image 对象会触发 Unloaded 事件并删除文件。为了解决这个问题,我尝试在 Unloaded 事件期间检测 Image 对象属性的变化。我发现我可以使用 Parent 属性。FlowDocument 中 Image 对象的父对象是 InlineUIContainer。因此,如果图像被删除,InlineUIContainer 的父级变为空(当焦点转移到其他 TabItem 时不为空)。这让我点头删除图像文件,它可以按需要工作。

但是当图像落入选择范围时问题就开始了。在这种情况下,会触发 Unloaded 事件,但 InlineUIContainer 的 Parent 不为空。我追查到——

  1. 图像在段落中,段落的父级变为空,
  2. 图像在 TableCell 中,表的父级变为空,
  3. 图像在 ListItem 中,List 的 Parent 变为 null。

图像在树中可能很深。所以检查每个容器的父级是很烦人的。

然后我想在 Delete/Backspace 按键上抓取所选内容的 XAML。这样,我将使用 XML API 解析选择中的图像标签并删除这些文件。我尝试编写代码将 RichTextBox 的选择保存到文件中。所有选定的元素,如表格、列表、段落等在结果 XAML 中都可用,但图像以某种方式从选择中省略。我正在编写以下代码。

var stream = new System.IO.FileStream("e:\\check.xml", System.IO.FileMode.Create);
rtfMain.Selection.Save(stream, DataFormats.Xaml, true);
stream.Close();

总之,我只想知道是否从 FlowDocument 中删除了任何内容(图像、超链接等)并删除了参考文件。但不知何故,解决方案似乎非常难以捉摸。

提前感谢您的时间。

里特什

4

0 回答 0