分享

wpf多级动态右键菜单ContextmMenu

 牛人的尾巴 2017-12-10
                 原创 2016年09月21日 17:54:38

  1.   
         搞这个右键菜单用了挺长的时间,一是网络上面资料比较少,二是里面有坑,坑就是众所周知,c#程序有两种窗口,一种是Form窗口,另一种是wpf窗口。网上的资料是这两种混合,开始我并没有意识到这两种有多大的差别,但是看了许多资料发现有很多自相矛盾的地方,因为这两种窗口有很多不同的地方:
  • Formcontextmenustrip已经替代了contextmenu,但是contextmenu仍然可以用。
  • Wpf:只能使用contextmenu

 

contextmenucontextmenudtrip有以下几种区别:

1】可以将ContextMenuStrip 与任何控件关联,单击鼠标右键会自动显示快捷菜单。

2】可以通过使用 Show 方法以编程方式显示 ContextMenuStrip

3ContextMenuStrip支持可取消的 Opening Closing 事件以处理动态填充和多次单击方案。

4ContextMenuStrip支持图像、菜单项复选状态、文本、访问键、快捷键和级联菜单。 

尽管 ContextMenuStrip 对以前版本的ContextMenu 控件的功能进行了替换和添加,但考虑到向后兼容性和将来的使用(如果的确需要),仍然保留了 ContextMenu

建议采用ContextMenuStrip

Form我没有研究,写一下wpf右键菜单实现方式。


     强行使用contextmenustrip

      虽然wpf不能加contextmenustrip控件,但是可以在右键单击响应里使用show显示出来。好处是比较方便,可以随意控制子菜单项,而且contextmenustrip可以随意加图片等其他部分。

实例如下:

1.简单添加

  1. <span style="font-size:14px;">((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("正常");  
  2.   
  3. ((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[  
  4.   
  5. 或:  
  6.   
  7. ToolStripDropDownItem ts   
  8. = ((ToolStripDropDownItem)contextMenuStrip1.Items["aToolStripMenuItem"]);  
  9.             ts = ((ToolStripDropDownItem)ts.DropDownItems["eToolStripMenuItem"]);  
  10.             ts.DropDownItems.Add(new ToolStripMenuItem("h"));"aToolStripMenuItem"]).DropDownItems["eToolStripMenuItem"])).DropDownItems.Add(new ToolStripMenuItem("h"));  
  11. ((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems[1])).DropDownItems.Add("OK");  
  12.             contextMenuStrip1.Items.Add("编辑");  
  13.             contextMenuStrip1.Items.Add("状态");  
  14.             ((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("正常");  
  15.             ((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("维修");  
  16.             ((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("建设中");  
  17.             ((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems[0])).DropDownItems.Add("hi");  
  18.             ((ToolStripDropDownItem)(((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems[0])).DropDownItems[0])).DropDownItems.Add("hao hi");</span>  

动态添加的方法为:

  1.  int count = dt.Rows.Count;  
  2.             ToolStripItem[] Tsi = new ToolStripItem[count];  
  3.             for(int i=0;i<count;i++)  
  4.            {  
  5.                this.contextMenuStrip2.Items.Add(dt.Rows[i]["ReportFormat"].ToString());  
  6.                this.contextMenuStrip2.Items[i].Click += new EventHandler(ts_1_click);    //对应的点击事件  
  7.            }  
  8.             contextMenuStrip2.Show(btPrint, 0, btPrint.Height);  
  9.         }  
在contextmenustrip中,可以直接使用这样的方式contextmenustrip.Items[1]指代这个菜单项的子项,在动态添加时特别方便。

     使用contextmenu

这个的好处是使用wpf自带的控件,安全性和性能/速度上都有优势,但是不如contextmenu那么灵活。实例如下:

  1. /************************************************************************************************/  
  2. // 项目人员列表右键单击  
  3.         private void list_project_staff_MouseRightButtonDown(object sender, MouseButtonEventArgs e)  
  4.         {  
  5.             // 添加删除人员菜单项  
  6.             //System.Windows.Controls.MenuItem menuitem_delete_staff = new System.Windows.Controls.MenuItem();  
  7.             //menuitem_delete_staff.Header = "删除人员";  
  8.             //menuitem_delete_staff.Click += delete_project_staff;  
  9.             //contextmenu_list_staff.Items.Clear();  
  10.             if (list_project_staff.SelectedIndex > -1) {  
  11.                 menuitem_delete_staff.Visibility = System.Windows.Visibility.Visible;  
  12.             } else {  
  13.                 menuitem_delete_staff.Visibility = System.Windows.Visibility.Collapsed;  
  14.             }  
  15.             // 动态添加人员菜单项  
  16.             menuitem_add_staff.Items.Clear();  
  17.             for (int i = 0; i < data.list_other_project_staff.Count; i++) {  
  18.                 System.Windows.Controls.MenuItem menuitem_add = new System.Windows.Controls.MenuItem();  
  19.                 menuitem_add.Header = data.list_other_project_staff[i].name;  
  20.                 menuitem_add.Click += add_project_staff;  
  21.                 menuitem_add_staff.Items.Add(menuitem_add);  
  22.             }  
  23.         }  
  24.   
  25. // 响应:添加  
  26. private void add_project_staff(object sender, RoutedEventArgs e)  
  27. {  
  28.     System.Windows.Controls.MenuItem menu = (sender as System.Windows.Controls.MenuItem);  
  29.     string name = menu.Header.ToString();  
  30.     // 发送数据  
  31.     try {  
  32.         this.server.send_package(new uplink_update_project_staff() {  
  33.             project_ID = data.list_project[listbox_display_projects.SelectedIndex].ID,  
  34.             staff_ID = data.list_other_project_staff.Find(x => x.name == name).ID,  
  35.             action = 1,  
  36.         });  
  37.     } catch {  
  38.   
  39.     }  
  40. }  
  41. /*************************************************************************************************/  

还有一点需要注意的是,将按钮事件放在Listbox时,如果选中了其中一向,并不会触发事件,所以需要给每一项也添加事件。可以看到contextmenu并不能使用Items[1]的方式指代菜单项。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多