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;
        }
    }
}

 

posted @ 2021-02-19 11:19  carrot_hlb  阅读(285)  评论(0编辑  收藏  举报