WPF处理ContextMenuOpening事件
以下内容从微软官网翻译而来 https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/how-to-handle-the-contextmenuopening-event?view=netframeworkdesktop-4.8
1、每个控件都可以添加一个ContextMenu,例如可以给Button添加一个ContextMenu
<Button Content="Button 1" Opacity="0.5" HorizontalAlignment ="Left" Margin="20" RenderTransformOrigin="0.5,0.5" x:Name="Button1"> <Button.ContextMenu> <ContextMenu> <MenuItem IsChecked="True" Header="编辑"></MenuItem> <MenuItem Header="保存"></MenuItem> </ContextMenu> </Button.ContextMenu> <Button.RenderTransform> <ScaleTransform ScaleX="-1" /> </Button.RenderTransform> </Button>
2、添加事件处理程序
Button1.ContextMenuOpening += Button1_ContextMenuOpening;
3、处理ContextMenuOpening事件的场景主要有以下几种:
显示菜单之前,调整菜单项
void AddItemToCM(object sender, ContextMenuEventArgs e) { //check if Item4 is already there, this will probably run more than once FrameworkElement fe = e.Source as FrameworkElement; ContextMenu cm = fe.ContextMenu; foreach (MenuItem mi in cm.Items) { if ((String)mi.Header == "Item4") return; } MenuItem mi4 = new MenuItem(); mi4.Header = "Item4"; fe.ContextMenu.Items.Add(mi4); }
显示菜单之前,整体替换菜单
void HandlerForCMO(object sender, ContextMenuEventArgs e) { FrameworkElement fe = e.Source as FrameworkElement; fe.ContextMenu = BuildMenu(); } ContextMenu BuildMenu() { ContextMenu theMenu = new ContextMenu(); MenuItem mia = new MenuItem(); mia.Header = "Item1"; MenuItem mib = new MenuItem(); mib.Header = "Item2"; MenuItem mic = new MenuItem(); mic.Header = "Item3"; theMenu.Items.Add(mia); theMenu.Items.Add(mib); theMenu.Items.Add(mic); return theMenu; }
抑制菜单的显示
void HandlerForCMO2(object sender, ContextMenuEventArgs e) { if (!FlagForCustomContextMenu) { e.Handled = true; //need to suppress empty menu FrameworkElement fe = e.Source as FrameworkElement; fe.ContextMenu = BuildMenu(); FlagForCustomContextMenu = true; fe.ContextMenu.IsOpen = true; } } }