WPF-右键菜单ContextMenu(WPF之Button.ContextMenu)

WPF-右键菜单ContextMenu(WPF之Button.ContextMenu)

在WPF(Windows Presentation Foundation)中,ContextMenu 是一个非常有用的控件,它允许你在用户界面元素(如按钮、文本框等)上右键点击时显示一个上下文菜单。这个菜单可以包含多个菜单项(MenuItem),每个菜单项都可以执行特定的操作。下面是如何在WPF中使用ContextMenu来为一个Button控件添加右键菜单的基本步骤。

1. 定义ContextMenu和MenuItem

首先,你需要在XAML中定义ContextMenu,并在这个ContextMenu中定义你想要显示的MenuItem。这可以通过直接在控件内部嵌套ContextMenu元素来实现,或者更常见地,通过资源(Resource)或样式(Style)来定义,然后将其分配给控件。

方式1:直接在Button中定义
<Button Content="点击我" Width="100" Height="30">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="选项1" Click="MenuItem_Click"/>
            <MenuItem Header="选项2" Click="MenuItem_Click_1"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>
方式2:通过资源定义
<Window.Resources>
    <ContextMenu x:Key="MyContextMenu">
        <MenuItem Header="选项1" Click="MenuItem_Click"/>
        <MenuItem Header="选项2" Click="MenuItem_Click_1"/>
    </ContextMenu>
</Window.Resources>

<Button Content="点击我" Width="100" Height="30" ContextMenu="{StaticResource MyContextMenu}"/>

2. 处理MenuItem的点击事件

在上面的XAML代码中,你已经定义了MenuItemClick事件处理器(例如MenuItem_ClickMenuItem_Click_1)。你需要在后台代码中实现这些事件处理器来执行你想要的逻辑。

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("选项1被点击");
}

private void MenuItem_Click_1(object sender, RoutedEventArgs e)
{
    MessageBox.Show("选项2被点击");
}

3. 使用ContextMenu的其它特性

ContextMenu支持许多有用的特性,比如你可以通过IsOpen属性来控制菜单是否打开,通过Placement属性来定义菜单的显示位置等。

4. 注意事项

  • 当你为多个控件定义相同的ContextMenu时,使用资源(Resource)是一个很好的做法,这样可以保持代码的DRY(Don’t Repeat Yourself)原则。
  • 确保ContextMenuIsOpen属性没有在你的代码中被错误地设置为false,这可能会阻止菜单的显示。
  • ContextMenu不仅仅可以绑定到Button上,它几乎可以绑定到WPF中的任何UI元素上。

通过上述步骤,你应该能够在WPF应用程序中为一个Button控件添加并成功使用ContextMenu了。


实例2:

<Button Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Content="按钮_具有右键菜单">
            <Button.ContextMenu>
                <ContextMenu StaysOpen="true">
                    <MenuItem Header="File"/>
                    <MenuItem Header="Save"/>
                    <Separator/>
                    <MenuItem Header="Recent Files">
                        <MenuItem Header="ReadMe.txt"/>
                        <MenuItem Header="Schedule.xls"/>
                    </MenuItem>
                </ContextMenu>
            </Button.ContextMenu>
        </Button>
Dictionary<string, RoutedEventHandler> dist = new Dictionary<string, RoutedEventHandler>();
            //添加右键菜单项,包括名称和事件
            dist.Add("添加", add_Click);
            dist.Add("修改", edit_Click);
            dist.Add("删除", del_Click);
            dist.Add("导出", putout_Click);
            dgrid.ContextMenu = ContextMenus(dist);

        #region 循环生成右键菜单
        private ContextMenu ContextMenus(Dictionary<string, RoutedEventHandler> list)
        {
            ContextMenu cm = new ContextMenu();
            //Style style = (Style)this.FindResource("ContextMenu"); //定义前台显示模板
            //cm.Style = style;
            foreach (var dc in list)
            {
                MenuItem menu = new MenuItem();
                //menu.Style = (Style)this.FindResource("JjxyMenuItem");
                menu.Header = dc.Key;
                menu.Click += dc.Value;
                cm.Items.Add(menu);
            }

            return cm;
        }
        #endregion 循环生成右键菜单

示例3:

                     <Button Height="30" Width="30" 
                             Content="&#xe614;" Foreground="#1296db" FontSize="22"
                             Style="{StaticResource Nav_Btn1}">
                         <Button.ContextMenu>
                             <ContextMenu Style="{StaticResource ContextAddPro}">
                                 <MenuItem Style="{StaticResource MenuItemTemplate1}"/>
                                 <MenuItem Header="二值化"  Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click">
                                 </MenuItem>

                                 <MenuItem Header="滤波"  Style="{StaticResource MenuItemTemplate}">
                                     <MenuItem Header="均值滤波" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                     <!--<MenuItem Header="中值滤波" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>-->
                                     <MenuItem Header="高斯滤波" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                 </MenuItem>

                                 <MenuItem Header="形态学运算"  Style="{StaticResource MenuItemTemplate}">
                                     <MenuItem Header="灰度膨胀" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                     <MenuItem Header="灰度腐蚀" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                 </MenuItem>

                                 <MenuItem Header="图像增强"  Style="{StaticResource MenuItemTemplate}">
                                     <!--<MenuItem Header="锐化" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>-->
                                     <MenuItem Header="对比度" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                     <!--<MenuItem Header="亮度调节" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>-->
                                     <MenuItem Header="灰度开运算" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                     <MenuItem Header="灰度闭运算" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                     <MenuItem Header="反色" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
                                 </MenuItem>

                                 <MenuItem Header="图像调整"  Style="{StaticResource MenuItemTemplate}">
                                 </MenuItem>
                                 <MenuItem Style="{StaticResource MenuItemTemplate1}"/>
                             </ContextMenu>
                         </Button.ContextMenu>
                     </Button>
     private void MenuItem_Click(object sender, RoutedEventArgs e)
     {
         try
         {
             MenuItem menu = sender as MenuItem;
             if (menu == null)
                 return;

             string name = menu.Header.ToString();

             switch (name)
             {
                 case "二值化":
                     //frm_ModuleObj.m_Emhan.Add(new ThresholdImage());
                     break;
                 case "均值滤波":
                     frm_ModuleObj.m_Emhan.Add(new MeanImage(this));
                     break;
                 case "中值滤波":
                     //frm_ModuleObj.m_Emhan.Add(new EmphaImage(this));
                     break;
                 case "高斯滤波":
                     frm_ModuleObj.m_Emhan.Add(new GaussImage(this));
                     break;
                 case "对比度":
                     frm_ModuleObj.m_Emhan.Add(new EmphaImage(this));
                     break;
                 case "反色":
                     frm_ModuleObj.m_Emhan.Add(new InvertImage(this));
                     break;
                 case "灰度开运算":
                     frm_ModuleObj.m_Emhan.Add(new GrayOpening(this));
                     break;
                 case "灰度闭运算":
                     frm_ModuleObj.m_Emhan.Add(new GrayClosed(this));
                     break;
                 case "灰度腐蚀":
                     frm_ModuleObj.m_Emhan.Add(new GrayErosionr(this));
                     break;
                 case "灰度膨胀":
                     frm_ModuleObj.m_Emhan.Add(new GrayDilation(this));
                     break;
                 default:
                     break;
             }

             int index = dgv_Empha.SelectedIndex;
             Refresh();
             if (index < 0)
             {
                 if (frm_ModuleObj.m_Emhan.Count > 0)
                     index = dgv_Empha.SelectedIndex = 0;
             }
             else
             {
                 if (frm_ModuleObj.m_Emhan.Count > 0)
                     dgv_Empha.SelectedIndex = index + 1;
             }

             if (index > -1)
             {
                 //显示控件窗体
                 Page_Change.Content = new Frame()
                 {
                     Content = frm_ModuleObj.m_Emhan[index].m_Control
                 };
             }
         }
         catch (Exception ex)
         {
             System.Windows.Forms.MessageBox.Show(ex.ToString());
             Log.Error(frm_ModuleObj.ModuleParam.ModuleName + ":" + ex.ToString());
         }
     }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值