WPF weißt komisches Verhalten auf in Verbindung mit WinForms

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von KillaChris.

    WPF weißt komisches Verhalten auf in Verbindung mit WinForms

    Hallo,

    ich sitze jetzt seit zwei Tagen vor einem rießen Problem.
    Ich habe ein WPF-Projekt, dieses wird vom Hauptprogramm (Win-Forms) aufgerufen.
    In meinem WPF-Projekt habe ich eine Baumstruktur (Ordner, ähnlich eines Explorers). Wenn nun auf einen dieser Ordner (TreeViewItem in einem TreeView) geklickt wird, wird ein Event geworfen und die Id dieses Ordners an das Hauptprogramm zurückgegeben. Das Hauptprogramm geht dann zu unserem Server, holt den Inhalt des Ordners ab und stellt diesen dar.

    Nun bekomme ich leider ein etwas seltsames Verhalten in meinem WPF-Projekt. Ich klicke auf ein TreeViewItem, dessen Inhalt wird abgeholt und dargestellt und plötzlich wird automatisch das Parent-TreeViewItem ausgewählt. Da ich das Event SelectedItem verwende, wird daher natürlich wieder der Inhalt des Parents im Hauptprogramm dargestellt und automatisch das nächste Parent im Baum abgeholt.
    Das ganze passiert solange bis die Root-Node erreicht ist.

    Ich kann mir einfach nicht erklären woher dieses Verhalten kommt, dass WPF automatisch die ganzen Parents abklappert. Ich bin den kompletten Code durchgegangen um herauszufinden was da getrieben wird, ich kann mir aber leider keinen Reim darauf machen. Ich stelle auch keine Funktionen bereit um das Parent zu selektieren, also kann dies auch kein ungewollter Fehler im Code sein.

    WPF scheint das automatisch zu machen. Warum auch immer. Hatte eventuell schonmal jemand ein ähnliches Problem oder irgendwelche Ideen, was dort passieren könnte?

    Edit
    Achja was ich vergessen habe. Es liegt definitiv am Zusammenspiel der 2 Projekte. Wenn ich die RaiseEvent Anweisung auskommentiere und das Event praktisch nicht vom WinForms-Projekt behandelt wird bleibt die Selektierung nämlich richtig.
    Ich habe auch schon einzelne Stellen in dem WinForms-Code auskommentiert und konnte damit auch erreichen, dass die Selektierung sich nicht geändert hat.
    Aber es lässt sich keine genaue Stelle bestimmen, welche ausgeführt werden muss, damit dieses Phänomen auftritt. Das Projekt arbeitet mit Multithreading und daher kommt es irgendwann einfach zu diesem Phänomen.
    Ich habe zu Testzwecken mal das ganze Multi-Threading weggelassen und die Funktionen der Reihe nach aufgerufen, dann wird einfach ganz am Ende wenn alle Funktionen abgeklappert wurden und das End Sub nach meiner RaiseEvent-Anweisung kommt das Parent Item ausgewählt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KillaChris“ ()

    ich denke, dass das ein RoutedEvent ist, welches der BubbleUp-RoutedStrategy folgt. Das heißt: das innerste Element empfängt es zuerst, und dann bubbelts up, sodass alle übergeordneten Elemente es auch empfangen.
    guck dir die RoutedEventArgs an, glaub mit .IsHandled=True kann man das bubbeln abstellen.
    Das mache ich leider schon.

    Wie gesagt ich reagiere auf das Event folgendermaßen:

    VB.NET-Quellcode

    1. Private Sub Tree_SelectedItemChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of System.Object))
    2. Dim s As Segment = e.NewValue
    3. Dim vm As FormServerTreeViewModelView = Me.DataContext
    4. If s.IsSelected Then
    5. e.Handled = True
    6. vm.SelectSegment(s.Id, False, False)
    7. End If
    8. End Sub


    Die SelectSegment Methode sieht dann so aus:

    VB.NET-Quellcode

    1. Public Sub SelectSegment(ByVal sgtId As Long, ByVal ctrlIsPressed As Boolean, ByVal rightButton As Boolean)
    2. If Not m_IsLocked Then
    3. If sgtId > 0 Then
    4. Me.SelectedSegment = GlobSegmentTree.GetSegment(sgtId)
    5. If Not Me.IsCheckable = Windows.Visibility.Visible Then
    6. RaiseEvent SegmentSelect(Me.SelectedSegment.ServerSegment, rightButton, ctrlIsPressed)
    7. End If
    8. End If
    9. End If
    10. End Sub


    Und wenn ich dort das RaiseEvent auskommentiere wird im Baum nicht nach oben gelaufen, sondern die Selektion bleibt.
    erstmal würde ich dir Option Strict On! empfehlen.
    Hat nix mit dem Problem zu tun, ist ganz einfach die Frage, ob man das Typensystem einer typsicheren Sprache für sich arbeiten lassen will oder nicht.

    vlt. meld ich mich nochmal wg. @Topic ...

    Edit: keine Ahnung.
    Bei mir wird das Event nur einmal pro Selection gefeuert, sogar egal, ob e.IsHandled=True gesetzt wird.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Es muss natürlich so aussehen:

    VB.NET-Quellcode

    1. Private Sub Tree_SelectedItemChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of System.Object))
    2. Dim s As Segment = TryCast(e.NewValue, Segment)
    3. If Not s Is Nothing Then
    4. Dim vm As FormServerTreeViewModelView = TryCast(Me.DataContext, FormServerTreeViewModelView)
    5. If Not vm Is Nothing Then
    6. If s.IsSelected Then
    7. e.Handled = True
    8. vm.SelectSegment(s.Id, False, False)
    9. End If
    10. End If
    11. End If
    12. End Sub


    Aber bei meinem Problem ist mir damit leider immernoch nicht geholfen.

    Ich habe bis jetzt nur herausgefunden, dass ein System.Windows.Forms.Application.DoEvents() das Problem scheinbar auch auslösen kann.
    Ich habe aber schon das ganze Projekt nach DoEvents durchsucht und diese Stellen auskommentiert. Scheinbar gibt es dort aber noch andere WinForms-Funktionen, welche dieses Verhalten herbeiführen können.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KillaChris“ ()