2016-06-13 21 views
1

Ich habe ein RichTextBox-Steuerelement in einer Anwendung, die ich gerade entwickle, die ich zusammen mit einer ToolBar verwende, um einen Rich-Text-Editor zu erstellen. Eine Funktion, die ich implementiert habe, ist die Möglichkeit für einen Benutzer, ein Bild einzufügen, jetzt ist es an dieser Stelle erwähnenswert, dass die Ausgabe von der RichTextBox RTF ist.Adorner zu Bild in WPF RichTextBox hinzufügen, wenn geladen

Wenn der Benutzer das Bild einfügt, verwende ich den folgenden Code, um das Bild zum Dokument hinzuzufügen und dann ein ResizeAdorner (Beispiel von hier RichTextBox Resizing Adorner) zu dem Bild hinzuzufügen, das dem Benutzer die Größe zu ändern. Wenn der Benutzer das Dokument speichert und lädt, bleibt die Größe des Bildes korrekt erhalten.

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

Das Problem und die Frage ist, dass, wenn das Dokument, das ich bin nicht in der Lage, herauszufinden, geladen wird, wie die ResizingAdorner auf die Bilder in dem Dokument hinzuzufügen. Ich bin mit einer angefügten Eigenschaft den Inhalt des Dokuments zu laden, unter dem Code der Teil ist, das Dokument lädt:

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; 

Könnte jemand helfen, wie ich bat die ResizingAdorner auf Bilder in dem geladenen Dokument hinzufügen kann?

Antwort

1

So habe ich einen Weg herausgearbeitet, dass ich die Adorner auf das Bild im Dokument durch die Selection Event-Handler und den folgenden Code

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

Und das ist die AddAdorner Methode

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)); 
      } 
     } 
    } 
} 
hinzufügen

Ich weiß, das ist wahrscheinlich nicht der eleganteste Weg, um dies zu erreichen, aber für mich funktioniert das so, dass ich dies posten wollte, so dass andere wählen können, um dies gegebenenfalls zu verwenden

+0

Es ist der Inline selbst der InlineUIContainer ... – hasi05