Contextmenü Eintrag einen EventHandler geben (WPF)

  • WPF

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von CensoredAlpaca.

    Contextmenü Eintrag einen EventHandler geben (WPF)



    Guten Tag,

    leider habe ich dieses kleine Problemchen und ich weiß nicht, wie ich einen EventHandler zu einem bestimmten Eintrag zuweisen kann. Ich finde keinen ContextMenuClickEventHandler oder ähnliches. Gibt es dazu eventuell eine einfache Lösung?
    @ErfinderDesRades Hmm.. Ich dachte, dass würde gehen. Schade. In C# WinForms funktioniert es wunderbar, ich wusste nicht das es dort solche Unterschiede gibt. Kannst du mir eventuell ein Beispiel in XAML zeigen, wie ich das verwirklichen könnte? Ich habe mit Beispiele angesehen, aber so ganz verstehe ich sie nicht. Vielleicht kann mir jemand von euch einmal zeigen, wie man sowas am schönsten macht.

    Ich bin bei WPF leider SEHR neu und komme frisch aus WinForms (sehr frisch). Ich weiß z.B nicht, wie man ein Click Event über XAML steuert usw. Ich habe vor dies in den nächsten Tagen ausführlich zu lernen, ich habe auch bereits dementsprechende Kurse geplant, aber ich bräuchte aktuell eine schnelle Lösung, damit ich weiter machen kann mit dem, was ich geplant habe.

    Edit:

    C#-Quellcode

    1. public partial class MainWindow : Window
    2. {
    3. public DelegateCommand OnCommand1a { get; private set; }
    4. public MainWindow()
    5. {
    6. InitializeComponent();
    7. OnCommand1a = new DelegateCommand(c => Cmd1a(), null);
    8. }
    9. private void Cmd1a()
    10. {
    11. MessageBox.Show("Hey!");
    12. }
    13. }


    XML-Quellcode

    1. <Button Content="Button" HorizontalAlignment="Left" Margin="312,185,0,0" VerticalAlignment="Top" Width="75">
    2. <Button.ContextMenu>
    3. <ContextMenu>
    4. <MenuItem Header="Ein Test!" Command="{Binding Path=OnCommand1a}"/>
    5. <MenuItem Header="Ein Test!"/>
    6. </ContextMenu>
    7. </Button.ContextMenu>
    8. </Button>


    DelegateCommand Class: pastebin.com/haSNCBfq

    Soweit bin ich nun. Leider passiert nichts bei einem Klick auf "Ein Test!". Irgendwelche Ideen?

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

    Ja, in Wpf basiert alles auf Databinding, Click-Eventhandler sollte man nicht mehr benutzen, und überhaupt den Window-Code-Behind. Nicht mehr benutzen.
    Also dein erstes Snippet - die ganze Datei: leeren.

    Programm-Logik findet bei Wpf im sog. Viewmodel statt - das ist eine ganze eigene Philosophie.
    einfach ist das erst, wenn mans gelernt hat.
    Also ich hab mal eine BeispielAnwendung gecodet: Grundlagen - MVVM-Anwendungs-Struktur
    Aber das ist auch nicht ganz auf "einfach" zugeschnitten, weil dort will ich ja auch die Leistungsfähigkeit des Konzepts zeigen (also warum sich lohnt, sich das anzutun).
    Guck doch "einfach" im Wpf-Tutorial-Bereich des Forums - einiges ist mit "Grundlagen" geflagt - das sollen wohl die Grundlagen sein.

    Hmm - ich glaub fast, dieses hier verliert noch die meisten erklärenden Worte zum MVVM-Pattern - fang hiermit an:
    Grundlagen - MVVM-Pattern, DataContext und DataTemplates im Treeview
    Ersteres Tut ist aber codemässig aktueller.

    Und dies hier: Grundlagen - MVVM: "Binding-Picking" im Xaml-Editor
    ist auch veraltet - Ist aber deshalb am wichtigsten, weil wenn man BindingPicking nie gesehen hat, murkelt man sich zwangsläufig zu Tode, weil man ja garnet weiss, dass man auch am Leben bleiben darf.

    Kannst dir auch NoFears Mammut-Werk Tutorialreihe <WPF lernen/> reintun.
    Das ist aber wirklich sehr viel, und kommt nur langsam vom Fleck.
    Weil NoFear hat eine andere Auffassung von MVVM als ich - ich erlaube mir, Teile des MVVM-Patterns erst dann zu programmieren, wenn es wirklich nötig ist.
    NoFear will das alles von Anfang an mt drinne haben, wogegen ich wiederum ich finde starke Einwände habe, denn das führt zu sehr viel Code, der garnix tut, und deshalb kaum zu verstehen ist.

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

    Hallo Ich gebe @ErfinderDesRades völlig recht. Entweder du erstellst das Contextmenu per XAML oder über Binding mittels Collection und DataTemplates. Das wäre die schönste Lösung.

    Aber.....

    Warum soll es per Code nicht klappen? Ein MenuItem hat ein Click Event und dieses kann man mit einem Handler versehen. Warum denn auch nicht?

    VB.NET-Quellcode

    1. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    2. Dim cm As New ContextMenu
    3. Dim mi As New MenuItem() With {.Header = "Item 1", .Tag = 1}
    4. AddHandler mi.Click, AddressOf MenuItem_Click
    5. cm.Items.Add(mi)
    6. Me.ContextMenu = cm
    7. End Sub
    8. Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    9. Debug.WriteLine($"Menuitem mit dem Header '{DirectCast(sender, MenuItem).Header}' wurd geklickt!")
    10. End Sub


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

    Vielen Dank für eure ausführlichen Antworten. Ich habe mich für das Click-EventHandler entschieden, da dieser grade sehr praktisch war (ich habe das ContextMenü nun doch in XAML geschrieben).

    Ich werde mir dennoch eure ausführlichen Antworten zu Herzen nehmen und mich darüber schlau machen, wie es noch besser ginge.