加载时,在WPF RichTextBox中将图像添加到图像

时间:2016-06-13 11:34:32

标签: c# wpf richtextbox adorner adornerlayer

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

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

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添加到文档中的图像。我使用附加属性来加载文档内容,下面的代码是加载文档的部分:

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添加到已加载文档中的任何图片吗?

1 个答案:

答案 0 :(得分:1)

所以我找到了一种方法,我可以通过SelectionChanged事件处理程序和以下代码将Adorner添加到Document中的Image中

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方法

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));
            }
        }
    }
}

我知道这可能不是实现这一目标的最优雅的方式,但对我来说这样做是有效的,所以我想发布这个,以便其他人可以选择在适当的时候使用它