Bild in RTB grösse ändern Adorner?!

  • WPF

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Bild in RTB grösse ändern Adorner?!

    Hallo,

    ich benötige Hilfe bei meiner Richtextbox, ich möchte gern ein Bild einfügen aus dem Clipboard also STRG+V ... Ist das bild dann eingefügt, möchte ich die möglichkeit haben es zu vergrössern oder verkleinern. Wie bei anderen programmen auch, klick auf das Bild, dann erscheint der Adorner und ich kann es grösser oder kleiner machen. Hat da wer was für mich? Über google habe ich nichts funktionierendes gefunden.

    Vielen Dank
    Hi,
    ich ändere in meinem Programm zum Beispiel die Schriftgröße einer RTB.
    Das hab ich so gemacht, das ich im ViewModel ein Property hab, welches an die FontSize der RTB gebunden ist.
    der schieberegler hat dann ein MinValue und ein MaxValue.
    Betätige ich nun den Schieberegler, wird die Schriftgröße geändert.

    Bei einem Image sollte es ähnlich funktionieren, kannst dir ja ein Property ImageHeight machen und die beim Schieberegler ändern, die Width stellst du dann relativ zur Höhe ein.
    also im Style zum Beispiel so:

    XML-Quellcode

    1. <Setter Property="Width" Value="{Binding ActualHeight, RelativeSource={RelativeSource Self}}" />
    "Hier könnte Ihre Werbung stehen..."

    r0tzi schrieb:

    vllt hat jemand die lösung so wie es in Word oder Outlook ist, mit Adorner

    Dafür gibt es keine Allgemeine lösung die wir dir hier am Silbertablet servieren könnten. Adorner musst du selbst erstellen.

    Schau mal da vorbei: docs.microsoft.com/en-us/dotne…ontrols/adorners-overview

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ja, die RTB ist so eine Sache. Du musst eben zusehen das du das Objekt (das Bild) auf jeden Fall zu einem Objekt macht welches am besten von FrameworkElement erbt.
    zb. ein InlineUIContainer und in diesem ist das Image.

    Aber generell würde ich hier mal die Frage einwerfen was genau du vorhast, evtl. gibt es ja einen einfacheren Weg. Muss ja nicht sein, aber ich kenne das. Oft sieht man die einfachste Lösung garnicht.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ok also:

    1. einen Auschnitt auf dem Bildschirm kopieren, also ins Clipborad nehmen. z.B. mit dem Programm Greenshot
    2. in die RTB mit CTRL+V einfügen.
    3. möglichkeit die grösse des Bildes ändern

    Es sollen / können auch mehrere Bilder eingefügt werden.
    Derzeit muss ich den Umweg gehen, dass Bild in Word einzufügen, grösse zu ändern und dann wieder copy-paste. Da diese Anwendnung bald mehrere Kollegen benutzen werden möchte ich den Umweg über Word nicht jedem "zumuten"
    Hallo

    Ja, es bleibt dir keine andere möglichkeit. Um das Objekt verändern zu können bzw. um einen Adordner drauf zu legen musst du das Objekt zu einem UI Element machen.
    Wie man das macht gibt ne Menge thread und sehr viel verschiedenes über die Suchmaschine. Ist nicht einfach und ne frikelei, aber so ist das eben bei RTBs.

    Probier mal an das Element ranzukommen. Das sollte ja kein Problem sein. Dann ein Adorner draufzulegen. Ich kan es momentan leider nicht selbst probieren da ich viel Stress auf der Arbeit habe, vieleicht schaffst du es ja selbst, ansonsten kann ich es ja mal probieren sobald ich Zeit habe.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Okay, deine Stichworte haben mir weitergeholen... hab mal was gebastelt... ist aber noch nicht ganz bug frei... paar exceptions kommen.. aber funktioniert ;)

    VB.NET-Quellcode

    1. Public selectedElement As UIElement
    2. Public Sizemode As Boolean
    3. Public initialX, initialY, initialWidth, initialHeight As Double
    4. Private Sub myAdornerLayer_MouseDown(sender As Object, e As MouseButtonEventArgs)
    5. Sizemode = True
    6. Dim img As Image
    7. img = CType(selectedElement, Image)
    8. Dim Posi As Point = Mouse.GetPosition(Me)
    9. initialX = Posi.X
    10. initialY = Posi.Y
    11. initialWidth = img.Width
    12. initialHeight = img.Height
    13. End Sub
    14. Private Sub myAdornerLayer_MouseUp(sender As Object, e As MouseButtonEventArgs)
    15. Sizemode = False
    16. End Sub
    17. Private Sub RTF_Question_PreviewMouseDown(sender As Object, e As MouseButtonEventArgs) Handles RTF_Question.PreviewMouseDown
    18. Try
    19. If selectedElement IsNot Nothing Then Exit Sub
    20. If TypeOf e.Source Is FlowDocument Then
    21. ' selectedElement = TryCast((CType(e.Source, FlowDocument)).Parent, UIElement)
    22. Else
    23. selectedElement = TryCast(e.Source, UIElement)
    24. End If
    25.  
    26.  
    27. Dim myAdornerLayer = AdornerLayer.GetAdornerLayer(selectedElement)
    28. myAdornerLayer.Add(New SimpleCircleAdorner(selectedElement))
    29. AddHandler myAdornerLayer.MouseDown, AddressOf myAdornerLayer_MouseDown
    30. AddHandler myAdornerLayer.MouseUp, AddressOf myAdornerLayer_MouseUp
    31. Catch
    32. End Try
    33. End Sub
    34. Private Sub RTF_Question_MouseMove(sender As Object, e As MouseEventArgs) Handles RTF_Question.MouseMove
    35. Try
    36. Dim img As Image
    37. img = CType(selectedElement, Image)
    38. img.Stretch = Stretch.Fill
    39. Dim newx, newy As Double
    40. Dim Posi As Point = Mouse.GetPosition(Me)
    41. If Sizemode = True Then
    42. newx = (Posi.X - initialX)
    43. newy = (Posi.Y - initialY)
    44. img.Width = initialWidth + newx
    45. img.Height = initialHeight + newy
    46. End If
    47. Catch
    48. End Try
    49. End Sub
    50. Private Sub RTF_Question_PreviewKeyDown(sender As Object, e As KeyEventArgs) Handles RTF_Question.PreviewKeyDown
    51. If e.Key = Key.Escape Then
    52. Try
    53. Dim myAdornerLayer = AdornerLayer.GetAdornerLayer(selectedElement)
    54. Dim toRemoveArray As Adorner() = myAdornerLayer.GetAdorners(selectedElement)
    55. Dim toRemove As Adorner
    56. If toRemoveArray IsNot Nothing Then
    57. toRemove = toRemoveArray(0)
    58. myAdornerLayer.Remove(toRemove)
    59. End If
    60. Catch
    61. End Try
    62. selectedElement = Nothing
    63. End If
    64. End Sub
    65. End Class
    66. Public Class SimpleCircleAdorner
    67. Inherits Adorner
    68. Public Sub New(ByVal adornedElement As UIElement)
    69. MyBase.New(adornedElement)
    70. End Sub
    71. Protected Overrides Sub OnRender(ByVal drawingContext As DrawingContext)
    72. Dim adornedElementRect As Rect = New Rect(Me.AdornedElement.DesiredSize)
    73. Dim renderBrush As SolidColorBrush = New SolidColorBrush(Colors.Green)
    74. renderBrush.Opacity = 0.2
    75. Dim renderPen As Pen = New Pen(New SolidColorBrush(Colors.Navy), 1.5)
    76. Dim renderRadius As Double = 5.0
    77. drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius)
    78. drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius)
    79. drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius)
    80. drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius)
    81. End Sub
    82. End Class
    Super, das freut mich.

    Die Exceptions wirste sicher auch noch los.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##