【问题标题】:Remove images from RichTextBox FlowDocument从 RichTextBox FlowDocument 中删除图像
【发布时间】:2022-01-15 00:31:46
【问题描述】:

我有一个 WPF 应用程序,用户可以在该应用程序上将 Word 中的一些数据粘贴到 RichTextBox 中...但如果该单词数据有图像,我需要将其删除,我该如何实现?

由于 FlowDocument 是 xml,也许做一些 linq 魔术可以做到,但我不知道怎么做。

【问题讨论】:

标签: wpf richtextbox flowdocument


【解决方案1】:

有一个名为 WordtoXAML 转换器 (http://wordtoxaml.codeplex.com) 的工具。您可以使用它将您的 Word 文档内容转换为 XAML,使用正则表达式匹配来识别图像,然后将它们删除。

【讨论】:

  • 嗯,托管 FlowDocument 的 RichTextBox 将在您从 Word 粘贴时进行转换,因此将第 3 方工具添加到解决方案不会使这项任务变得更容易。
【解决方案2】:

下面的代码会做你想做的事。虽然它可能有点浪费(它会查看整个文档,而不仅仅是刚刚粘贴的部分),但这是唯一的方法,因为有时 RichTextBox 在指示最近绘制的范围时是不准确的:

 public class MyTextBox : RichTextBox
    {

        public MyTextBox()
        {
            CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Paste));
        }

        protected virtual void Paste(object sender, ExecutedRoutedEventArgs e)
        {
            Paste();

            foreach (var image in FindImages())
            {
                if (image.SiblingInlines != null)
                {
                    image.SiblingInlines.Remove(image);
                }
            }
        }

        IEnumerable<InlineUIContainer> FindImages()
        {
            var result = new List<InlineUIContainer>();
            var blocks = Document.Blocks;
            for (TextPointer position = blocks.FirstBlock.ElementStart; position != null && position.CompareTo(blocks.LastBlock.ElementEnd) != 1; position = position.GetNextContextPosition(LogicalDirection.Forward))
            {
                InlineUIContainer element = position.Parent as InlineUIContainer;
                if (element != null && element.Child is Image)
                {
                    result.Add(element);
                }
            }
            return result;
        }
    }

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2023-03-19
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多