Ich habe eine TreeView mit einem ContextMenu mit Click-Ereignissen. Wenn das Klickereignis im Kontextmenü ausgelöst wird, erhalte ich offensichtlich das MenuItem als Quelle des Ereignisses. Wie kann ich herausfinden, welcher Knoten in der TreeView derjenige war, der das ContextMenu ausgelöst hat?Wie erhalte ich die Quelle eines von ContextMenu stammenden Ereignisses in WPF?
Antwort
Im Allgemeinen speichern Sie den TreeView-Knoten (z. B. die Quelle des Popup-Ereignisses, vielleicht der ausgewählte Knoten - abhängig von Ihrer Schnittstelle in einer privaten Variablen auf Klassenebene im "Pop-up" -Ereignis des ContextMenus) , dann verweisen Sie auf diese Variable im Click-Ereignis des Menüs.
Alternativ, wenn Sie RoutedUICommands
verwenden, können Sie die OriginalSource
Eigenschaft auf ExecuteRoutedEventArgs
und CanExecuteRoutedEventArgs
verwenden, um die FrameworkElement
zu finden, wo Command
seine Blase begann.
Die OriginalSource
jedoch möglicherweise der innere TextBlock oder ein anderes Element in der DataTemplate des Knotens, so dass Sie den VisualTreeHelper verwenden müssen, um die Eltern, die Sie möchten, zu finden. Ich habe einen Wrapper um diese Funktionalität implementiert, der dem folgenden ähnelt: http://www.hardcodet.net/2008/02/find-wpf-parent/
Dieser Ansatz ist gut, wenn Sie Ihre Befehlslogik in einer großen Anwendung trennen/zentralisieren möchten.
Ich hatte sehr viel Glück mit der DataContext-Eigenschaft auf der OriginalSource, wenn ich mit der Datenbindung ganz durchging. OriginalSource sollte immer ein FrameworkElement sein. –
Mein Problem ist jetzt gelöst, aber Ihre Lösung scheint ziemlich gut zu sein. Ich werde es in den nächsten Tagen überprüfen. Vielen Dank. – sker
// hat es doch einen besseren Weg, als diese ... TreeViewItem tvi = (((Absender als MenuItem) .Parent als ContextMenu) .Parent als Popup) .PlacementTarget als TreeViewItem sein;
Das funktioniert, aber warum sollte ich es nicht so machen?
- 1. von ContextMenu in WPF-Befehl
- 2. WPF ContextMenu
- 3. Wie greife ich auf die Quelle eines GUI-Ereignisses in PowerShell zu?
- 4. Informationen über die Quelle eines Ereignisses mit jQuery abrufen
- 5. Wie WPF ContextMenu Animationen deaktivieren?
- 6. WPF: TreeViewItem Löschen von ContextMenu
- 7. CommandParameters in ContextMenu in WPF
- 8. WPF Contextmenu und ListView
- 9. Default ContextMenu Style - WPF
- 10. WPF ContextMenu Stil Struktur
- 11. WPF contextMenu Klick-Problem
- 12. Wie setze ich ContextMenu eines gebundenen Objekts?
- 13. Wie erhalte ich die Quelle der Anfrage vom Web Service?
- 14. WPF: Wie man ContextMenu dynamisch generiert
- 15. Wie kann ich ein ContextMenu zum Schließen zwingen (WPF-Projekt)?
- 16. Wie erhalte ich die Zeitzone eines Benutzers?
- 17. Festlegen der PlacementTarget-Eigenschaft eines WPF ContextMenu in XAML?
- 18. Wie wird die Quelle von WPF ListView aktualisiert?
- 19. WPF: Unterdrücken ContextMenu für ListView
- 20. Wie melde ich eine Klassenkomponente eines Ereignisses?
- 21. Wie erhalte ich die android_id eines Geräts?
- 22. Wie erhalte ich die PID eines Knotennamens?
- 23. WPF ContextMenu weiterhin sichtbar nach dem Start eines externen Prozesses
- 24. Die Farbe eines Ereignisses beibehalten
- 25. Kann ich ein Standard-ContextMenu für WPF CustomControls definieren?
- 26. WPF: Binden eines ContextMenu an einen MVVM-Befehl
- 27. Wie finde ich die Quelle von JS_Parse_Error?
- 28. WPF ContextMenu - keine Zeichenfolge mit ItemTemplate
- 29. Anzeigen eines ContextMenu
- 30. openal: Erhalte die aktuelle Spielposition einer Quelle
Das ist eine gute Idee. Weißt du, ob das Popup-Ereignis ContextMenuOpening ist? Weder ContextMenuOpening noch ContextMenuClosing werden ausgelöst, wenn ich das Menü öffne. – sker
Sollte das Geöffnete Ereignis sein. http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.opened.aspx – dommer
Ok, ich benutze Telerik Treeview und es hat keine Opened-Event, aber ich habe es geschafft Mach es mit dem MouseRightButtonUp-Ereignis. Vielen Dank. – sker