Readdy Write  
0,00 €
Your View Money
Views: Count
Self 20% 0
Your Content 60% 0

Users by Links 0
u1*(Content+Views) 10% 0
Follow-Follower 0
s2*(Income) 5% 0

Count
Followers 0
Login Register as User

WPF: Parent Element eines KontextMenüs ermitteln

17.02.2019 (👁110)


Wie ermittelt man das Basis-Element, aus welchem ein ContextMenu geöffnet wurde

In Visual Studio, WPF

Im MenuItem->Click-Event

Zum Ermitteln, welches FrameworkElement das ContextMenü geöffnet hat, dann kann man das SourceElement durch ContextMenu.PlacementTarget ermitteln

private void Item_Click(object sender, RoutedEventArgs e)

{

    //-------------< Item_Click() >----------------------

    //*ContextMenu_Item

    //*: MenuItem__IDMitarbeiter_6_IDAbwesenheit_1_DatePlan_20190205

    MenuItem menuItem = (MenuItem) sender;

    string sName = menuItem.Name;

    

    //< QuellElement holen >

    ContextMenu contextMenu = (ContextMenu) menuItem.Parent;

    FrameworkElement element= (FrameworkElement) contextMenu.PlacementTarget;

    //</ QuellElement holen >

    //-------------</ Item_Click() >----------------------

}

Damit man aber auch das ContextMenu zur Laufzeit finden kann muss man dem ContextMenu beim Erstellen ebenfalls das PlacementTarget zuweisen

contextMenu.PlacementTarget = element ; 

C# wpf Contextmenu erstellen

private void Open_ContextMenu(object sender, MouseButtonEventArgs e)

        {

            //---------------------< Open_ContextMenu() >---------------------

            

            

            //< init >

            //*get values from drag_button_start

            FrameworkElement element= (FrameworkElement) sender;

            string sControlname = element.Name;

            int IDMitarbeiter = clsStrings.get_Key_Value_from_String_as_Integer(sControlname, "IDMitarbeiter");

            String DatePlan = clsStrings.get_Key_Value_from_String(sControlname,"DatePlan");

            //</ init >

 

            

            ContextMenu contextMenu = new ContextMenu();

 

            //--< Get_Fehlzeiten >--

            var data_Abwesenheiten = db.tblBase_Abwesenheitsgruende;

 

            foreach (var Abwesenheit in data_Abwesenheiten)

            {

                //--</ Get_Fehlzeiten >--

                int IDAbwesenheit = Abwesenheit.IDAbwesenheitsgrund;

                string Abwesenheitsgrund = Abwesenheit.Abwesenheitsgrund;

                string sBackgroundColor = Abwesenheit.Farbe;

                string sTextColor = Abwesenheit.Textfarbe;

                //--< MenuItem_anfuegen >--

 

 

                MenuItem item = new MenuItem();

                item.Header = Abwesenheitsgrund ;

                item.Name = "MenuItem_" + "_IDMitarbeiter_" + IDMitarbeiter + "_IDAbwesenheit_" + IDAbwesenheit + "_DatePlan_" + DatePlan;

                if (sBackgroundColor != ""){

                    //item.Background = new SolidColorBrush(ColorConverter.ConvertFromString(sBackgroundColor));

                }

 

                //< click_Event >

                item.Click += Item_Click; ;

                //</ click_Event >

 

                //*anfuegen

                contextMenu.Items.Add(item);

                

                //--</ MenuItem_anfuegen >--

            }

 

            //< anfuegen >

            //*an wpf Element als contextmenu anfuegen

            //contextMenu.Visibility = Visibility.Visible;

            element.ContextMenu = contextMenu;

            contextMenu.PlacementTarget = element ; //*fuer referenz in menuItem

            //< anfuegen >

 

            //< anzeigen >

            contextMenu.IsOpen=  true;  //*anzeigen, aufklappen

            //< anzeigen >

            //*Original-Event ausschalten

            //*damit der Event nicht durch den original-Mausklick geschlossen wird, muss man den Vorgang beenden

            e.Handled = true;

 

            //---------------------</ Open_ContextMenu() >---------------------

        }