首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载时将装饰器添加到WPF RichTextBox中的图像

加载时将装饰器添加到WPF RichTextBox中的图像
EN

Stack Overflow用户
提问于 2016-06-13 19:34:32
回答 1查看 1.2K关注 0票数 1

我正在开发的应用程序中有一个RichTextBox控件,该控件与ToolBar一起用于创建富文本编辑器。我已经实现的一个功能是让用户能够插入图像,现在值得注意的是,RichTextBox的输出是RTF。

当用户插入图像时,我使用以下代码将图像添加到文档中,然后向图像添加一个允许用户调整大小的ResizeAdorner (示例为RichTextBox Resizing Adorner)。当用户保存并加载文档时,Image的大小保持正确。

代码语言:javascript
复制
private void BtnInsertImage_OnClick(object sender, RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Multiselect = false;
    ofd.CheckFileExists = true;
    ofd.CheckPathExists = true;
    ofd.Filter = "Image files (*.png;*.jpg;*.jpeg;*.gif;*.bmp)|*.png;*.jpg;*.jpeg;*.gif;*.bmp";
    ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
    ofd.Title = "Insert Image";
    if (ofd.ShowDialog() == true)
    {
        BitmapImage bitmap = new BitmapImage(new Uri(ofd.FileName, UriKind.RelativeOrAbsolute))
                                 {
                                     CacheOption = BitmapCacheOption.OnLoad
                                 };
        Image image = new Image();
        image.IsEnabled = true;
        image.Source = bitmap;
        image.Width = bitmap.Width;
        image.Height = bitmap.Height;
        image.Loaded += this.ImageOnLoaded;
        image.Stretch = Stretch.Uniform;

        InlineUIContainer container = new InlineUIContainer(image, this.rtbEditor.Selection.Start);
        Paragraph paragraph = new Paragraph(container);

        var doc = this.rtbEditor.Document;
        doc.Blocks.Add(paragraph);
    }
}

private void ImageOnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
    var img = sender as Image;
    if (img != null)
    {
        var al = AdornerLayer.GetAdornerLayer(img);
        if (al != null)
        {
            al.Add(new ResizingAdorner(img));
        }
    }
}

问题是,当加载文档时,我无法弄清楚如何将ResizingAdorner添加到文档中的图像。我使用一个附加的属性来加载文档内容,下面的代码是加载文档的部分:

代码语言:javascript
复制
var stream = new MemoryStream(Encoding.UTF8.GetBytes(GetDocumentXaml(richTextBox)));
var doc = new FlowDocument();
var range = new TextRange(doc.ContentStart, doc.ContentEnd);

range.Load(stream, DataFormats.Xaml);

richTextBox.Document = doc;

有没有人可以帮我把ResizingAdorner添加到加载的文档中的任何图像中?

EN

回答 1

Stack Overflow用户

发布于 2016-06-13 23:46:10

因此,我已经找到了一种方法,可以通过SelectionChanged事件处理程序和以下代码将装饰器添加到文档中的图像中

代码语言:javascript
复制
var inline = this.rtbEditor.CaretPosition.GetAdjacentElement(LogicalDirection.Forward) as Inline;
if (inline != null)
{
    this.AddAdorner(inline.NextInline as InlineUIContainer);
    this.AddAdorner(inline.PreviousInline as InlineUIContainer);
}

这是AddAdorner方法

代码语言:javascript
复制
private void AddAdorner(InlineUIContainer container)
{
    if (container != null)
    {
        var image = container.Child;
        if (image != null)
        {
            var al = AdornerLayer.GetAdornerLayer(image);
            if (al != null)
            {
                var currentAdorners = al.GetAdorners(image);
                if (currentAdorners != null)
                {
                    foreach (var adorner in currentAdorners)
                    {
                        al.Remove(adorner);
                    }
                }

                al.Add(new ResizingAdorner(image));
            }
        }
    }
}

我知道这可能不是实现这一点的最优雅的方式,但对我来说,这是我的作品,所以我想把这篇文章贴出来,以便其他人可以选择在适当的情况下使用它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37788788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档