ComboBox Zugriff auf Events der Textbox erhalten

  • WPF
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    ComboBox Zugriff auf Events der Textbox erhalten

    Hallo Leute.

    In dem Projekt befindet sich eine Combox die auf IsEditable=True gesetzt ist. Klickt man jetzt auf den ausgewählten Text, dann ist der immer komplett markiert. Nun versuche ich das abzustellen und den Cursor sofort auf die angeklickte Stelle im Text zu setzen. Erster Ansatz war ein Attached Property, aber da lassen sich ja nur die Events der Combobox und nicht die ihrer Childs abonieren.
    Der Plan ist es, im Event "PreviewMouseDown" die Cursorpositon auszulesen und später (wo und wann ist noch unklar) wieder zu setzen.
    Alternative und vor allem bessere Ideen werden gerne in Empfang genommen. :)

    Kann mir da einer weiterhelfen?
    Nochmal "kurz" damit beschäftig und schon war die Lösung da. ;)

    VB.NET-Quellcode

    1. Public Sub CB_Hist_GotFocus(sender As Object, e As RoutedEventArgs)
    2. Dim MYCombobox As ComboBox = DirectCast(sender, ComboBox)
    3. Dim Textbox_Content As TextBox = FindVisualChild(Of TextBox)(MYCombobox, "PART_EditableTextBox") 'die Textbox mit dem Content, also dem ausgewählten Text innerhalb der Combobox finden
    4. Textbox_Content.SelectionLength = 0 'Markierungslänge auf 0 setzen, also den Text nicht markieren
    5. Dim Maus_Position As Point = Mouse.GetPosition(Textbox_Content) 'die aktuelle Mausposition in der Textbox speichern
    6. Maus_Position = New Point(Maus_Position.X - 5, Maus_Position.Y) 'die Mausposition mit einem Offset belegen für die SelectionStart unten
    7. Dim charIndex As Integer = Textbox_Content.GetCharacterIndexFromPoint(Maus_Position, True) 'findet den nächsten Buchstaben anhand der Cursorposition
    8. Textbox_Content.Focus() 'Fokus auf die Textbox setzen
    9. Textbox_Content.SelectionStart = charIndex + 1 'die Funktion hat den Cursor immer vor den letzten Buchstaben festgelegt, daher hier +1, das wird über den Offset oben wieder ausgeglichen
    10. 'Zugriff auf ein Event nur als Beispiel wg. der Fragestellung
    11. AddHandler Textbox_Content.MouseDown, AddressOf CB_MouseDown
    12. End Sub
    13. Private Function FindVisualChild(Of T As DependencyObject)(obj As DependencyObject, Name As String) As T
    14. For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(obj) - 1
    15. Dim child As DependencyObject = VisualTreeHelper.GetChild(obj, i)
    16. If child IsNot Nothing AndAlso TypeOf child Is T AndAlso CType(child, FrameworkElement).Name = Name Then
    17. Return CType(child, T)
    18. Else
    19. Dim childOfChild As T = FindVisualChild(Of T)(child, Name)
    20. If childOfChild IsNot Nothing Then
    21. Return childOfChild
    22. End If
    23. End If
    24. Next i
    25. Return Nothing
    26. End Function


    Zugriff auf die Events erhält man, indem man halt die Events der "Textbox_Content " oben aboniert.
    Wie man sieht ist das in meiner Lösung aber nicht geschehen. Das Problem daran; das Event "MouseDown" (oder gleichartiges) feuert nicht beim ersten anklicken der Combobox. ?( Weder das Event direk von der Combobox, noch das der Childs. Erst wenn der Fokus schon daruaf liegt und dann nochmal geklickt wird feuert das Event. Daher unbrauchbar für meine Zwecke.
    Das Event "GotFocus" feuert aber. In der Methode für "GotFocus" wird jetzt die Textbox mit dem ausgewählten Text (also die für den Content) gesucht. Dann stellt die Methode die Mausposition fest und berechnet die Position zu den Buchstaben. Zuletzt wird die Cursorposition gesetzt. Das ganze mit einem Offset, weil mach sonst den Cusor nicht ans Ende setzen konnte.
    Vielleicht kann es ja mal jemand gebrauchen.

    Gruß
    eddi