RTB Hyperlink einfügen "mit Link"

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von r0tzi.

    RTB Hyperlink einfügen "mit Link"

    Hi Leute,

    ich suche seit 4 Stunden nach einer eleganten möglichkeit in eine RTB einen Hyperlink einzufügen. Wenn der "komplette" Hyperlink im Clipboard ist, wie er zB von Word erstellt werden kann, funktioniert das einwandfrei.
    Eine Lösung wäre, wie zB. eine Textbox worin ich den nackten Link einfüge und es daraus den Hyperlink macht und ihn entweder in die RTB direkt am Ende einfügt oder diesen ins Clipboard setzt.

    Der String für den kompletten Link im RTF format sieht so aus:
    \rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}{\f3\fcharset0 Calibri;}}{\colortbl\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red0\green102\blue204;\red5\green99\blue193;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs22\f3\cf0 \cf0\ql{\fs18\f2 {\ul\cf3\ltrch {\field{\*\fldinst { HYPERLINK "www.google.de" }}{\fldrslt {{\lang2052\cf4\ltrch "www.google.de"}}}}}\li0\ri0\sa200\sb0\fi0\ql\par}" & vbCrLf & "}" & vbCrLf & "}


    leider kann ich den so nicht in die RTB einfügen, weil es dann nur den blank text einfügt... es muss also im RTF oder XAML format eingefügt werden.

    Was eine zweite möglichkeit wäre, zB. mit Enter oder Space die RTB zu überprüfen und aus allen Links, Hyperlinks automatisch zu erstellen und zu ändern. Leider nichts brauchbares gefunden bisher für WPF.

    Hat jemand eine Lösung für mich?
    Ich sehe gerade Parallelen zu diesem aktuellen Thread.
    In WinForms ist es so: Solange bei der RTB DetectUrls auf True steht, wird doch jeder "normale" Link zum anklickbaren Hyperlink.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @r0tzi Machma vor und nach dem Hyperlink ein Leerzeichen.
    Ansonsten probierma RTB.DetectUrls = True
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry vergessen ist WPf, in Wpf gibts das ned!

    Link Starten ist kein problem.

    Bei der RTB

    Quellcode

    1. IsDocumentEnabled
    auf True und XAML

    XML-Quellcode

    1. <Style TargetType="Hyperlink">
    2. <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=NavigateUri.OriginalString}" />
    3. <Setter Property="Cursor" Value="Hand" />
    4. <EventSetter Event="RequestNavigate" Handler="Hyperlink_RequestNavigate" />
    5. </Style>


    Code

    VB.NET-Quellcode

    1. Private Sub Hyperlink_RequestNavigate(ByVal sender As Object, ByVal e As System.Windows.Navigation.RequestNavigateEventArgs)
    2. Process.Start(e.Uri.ToString())
    3. End Sub


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „r0tzi“ ()

    r0tzi schrieb:

    Sorry vergessen ist WPf

    Und warum Postest du das dann nicht im WPF Bereich? Dort kann dir sicher besser geholfen werden denkst du nicht?

    Ich kann dir nur die RTB vom XCeed Toolkit empfehlen. Die unterstütz auch Binding über die Text Property. Außerdem gibt es für diese "Formatter". Es gibt vorgefertigte wie z.b. den RTF Fomatter aber man kann auch einen eigenen Formatter erstellen. Was du aber im Moment nicht brauchst. Sogar eine FormatBar die es dir ja Total einfach macht.

    Falls du sogar deinen eigenen Formatter implementieren möchtest habe ich ein Beispiel in diesem Post erstellt und diesen in weitere Folgen des Threadverlaufs auch noch verbessert.
    Ist rudimentär, aber deshalb umso besser um ihn zu verstehen.

    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. ##

    r0tzi schrieb:

    Wpf
    Und der hier:

    RodFromGermany schrieb:

    Machma vor und nach dem Hyperlink ein Leerzeichen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Machma vor und nach dem Hyperlink ein Leerzeichen.


    klappt nicht, es bleibt einfacher text.

    @Nofear23m
    Danke, ich habs mir angeschaut... uiui da habe ich viel zu ändern -.-

    kriegen wir das vllt doch nicht erstmal "so" hin, ohne das Toolkit? wir gesagt, mir würde eigentlich eine textbox schon reichen, die aus der Adresse, mit den Hyperlink ins Clipboard kopiert dass ich es manuell wieder einfügen kann.

    r0tzi schrieb:

    kriegen wir das vllt doch nicht erstmal "so" hin, ohne das Toolkit?

    Sicher. Aber wäre es nicht über z.b. ein Contextmenü einfacher?

    Da ich mal dafon ausgehe das du ohne Binding arbeitest hier eine Version mit CodeBehind welche ich schnell probiert habe.

    XAML:

    XML-Quellcode

    1. <RichTextBox x:Name="rtbTest" IsDocumentEnabled="True">
    2. <RichTextBox.ContextMenu>
    3. <ContextMenu>
    4. <MenuItem Header="Create link from selektion" Click="menuItemMakeLink_Click"/>
    5. </ContextMenu>
    6. </RichTextBox.ContextMenu>
    7. </RichTextBox>


    VB.NET-Quellcode

    1. Class MainWindow
    2. Private Sub menuItemMakeLink_Click(sender As Object, e As RoutedEventArgs)
    3. If rtbTest.Selection IsNot Nothing Then
    4. Dim link As String = rtbTest.Selection.Text
    5. Dim linkText As String = InputBox("Welcher Text soll statt dem Link angezeigt werden?", link)
    6. Dim tr As New TextRange(rtbTest.Selection.Start, rtbTest.Selection.End)
    7. Dim hl As New Hyperlink(tr.Start, tr.End) With {.NavigateUri = TryToMakeValidUri(link), .IsEnabled = True}
    8. hl.Inlines.Clear() : hl.Inlines.Add(linkText)
    9. AddHandler hl.Click, AddressOf OpenLink
    10. End If
    11. End Sub
    12. Private Function TryToMakeValidUri(uriText As String) As Uri
    13. If Not uriText.Contains("http://") Then
    14. uriText = uriText.Insert(0, "http://")
    15. End If
    16. If Uri.IsWellFormedUriString(uriText, UriKind.Absolute) Then
    17. Return New Uri(uriText, UriKind.Absolute)
    18. Else
    19. Return Nothing
    20. End If
    21. End Function
    22. Private Sub OpenLink(ByVal sender As Object, ByVal e As RoutedEventArgs)
    23. Process.Start(DirectCast(sender, Hyperlink).NavigateUri.AbsoluteUri)
    24. End Sub
    25. End Class


    Du kannst einfach eine URI innerhalb der RTB markieren und mit Rechtklick auf die RTB über das Contextmenü einen Hyperlink generieren wobei du gefragt wirst was statt dem Link stehen soll.
    Danach kann man dem Link folgen indem man STRG gedrückt hält.

    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. ##

    Hilft dir die hier beschriebene Funktion? Hab mal getestet damit, für Dich direkt in VB und hat ganz gut geklappt.

    VB.NET-Quellcode

    1. Private Function ConvertTextUrlToLink(ByVal url As String) As String
    2. Dim regex As String = "((www\.|(http|https|ftp|news|file)+\:\/\/)[_.a-z0-9-]+\. [a-z0-9\/_:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])"
    3. Dim r As Regex = New Regex(regex, RegexOptions.IgnoreCase)
    4. Return r.Replace(url, "a href=""$1"" title=""Click here to open in a new window or tab"" target=""_blank"">$1</a>").Replace("href=""www", "href=""http://www")
    5. End Function


    Leider steh ich mit RegEx auf dem Kriegsfuß, von daher finde ich es suboptimal mit einer Funktion zu arbeiten, die man nicht versteht.


    Nachtrag: @Nofear23m war nicht nur schneller, sein Code sieht auch wesentlich verständlicher aus.
    Ja, aber meine Umwandlung eines Text zu einer Uri ist wirklich nur rudimentär, da würde ich die von dir gefundene Methode verwenden.

    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. ##