窗口。网上的资料是这两种混合,开始我并没有意识到这两种有多大的差别,但是看了许多资料发现有很多自相矛盾的地方,因为这两种窗口有很多不同的地方:
  • Form contextmenustrip 已经替代了 contextmenu ,但是 contextmenu 仍然可以用。
  • Wpf: 只能使用 contextmenu

contextmenu contextmenudtrip 有以下几种区别:

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

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

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

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

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

建议采用 ContextMenuStrip

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

强行使用 contextmenustrip

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

实例如下:

1.简单添加

<span style="font-size:14px;">((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("正常");
((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[
ToolStripDropDownItem ts 
= ((ToolStripDropDownItem)contextMenuStrip1.Items["aToolStripMenuItem"]);
            ts = ((ToolStripDropDownItem)ts.DropDownItems["eToolStripMenuItem"]);
            ts.DropDownItems.Add(new ToolStripMenuItem("h"));"aToolStripMenuItem"]).DropDownItems["eToolStripMenuItem"])).DropDownItems.Add(new ToolStripMenuItem("h"));
((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems[1])).DropDownItems.Add("OK");
            contextMenuStrip1.Items.Add("编辑");
            contextMenuStrip1.Items.Add("状态");
            ((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("正常");
            ((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("维修");
            ((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems.Add("建设中");
            ((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems[0])).DropDownItems.Add("hi");
            ((ToolStripDropDownItem)(((ToolStripDropDownItem)(((ToolStripDropDownItem)contextMenuStrip1.Items[1]).DropDownItems[0])).DropDownItems[0])).DropDownItems.Add("hao hi");</span>
动态添加的方法为:
 int count = dt.Rows.Count;
            ToolStripItem[] Tsi = new ToolStripItem[count];
            for(int i=0;i<count;i++)
               this.contextMenuStrip2.Items.Add(dt.Rows[i]["ReportFormat"].ToString());
               this.contextMenuStrip2.Items[i].Click += new EventHandler(ts_1_click);    //对应的点击事件
            contextMenuStrip2.Show(btPrint, 0, btPrint.Height);
在contextmenustrip中,可以直接使用这样的方式contextmenustrip.Items[1]指代这个菜单项的子项,在动态添加时特别方便。

使用 contextmenu

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

	/************************************************************************************************/
	// 项目人员列表右键单击
			private void list_project_staff_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
				// 添加删除人员菜单项
				//System.Windows.Controls.MenuItem menuitem_delete_staff = new System.Windows.Controls.MenuItem();
				//menuitem_delete_staff.Header = "删除人员";
				//menuitem_delete_staff.Click += delete_project_staff;
				//contextmenu_list_staff.Items.Clear();
				if (list_project_staff.SelectedIndex > -1) {
					menuitem_delete_staff.Visibility = System.Windows.Visibility.Visible;
				} else {
					menuitem_delete_staff.Visibility = System.Windows.Visibility.Collapsed;
				// 动态添加人员菜单项
				menuitem_add_staff.Items.Clear();
				for (int i = 0; i < data.list_other_project_staff.Count; i++) {
					System.Windows.Controls.MenuItem menuitem_add = new System.Windows.Controls.MenuItem();
					menuitem_add.Header = data.list_other_project_staff[i].name;
					menuitem_add.Click += add_project_staff;
					menuitem_add_staff.Items.Add(menuitem_add);
	// 响应:添加
	private void add_project_staff(object sender, RoutedEventArgs e)
		System.Windows.Controls.MenuItem menu = (sender as System.Windows.Controls.MenuItem);
		string name = menu.Header.ToString();
		// 发送数据
		try {
			this.server.send_package(new uplink_update_project_staff() {
				project_ID = data.list_project[listbox_display_projects.SelectedIndex].ID,
				staff_ID = data.list_other_project_staff.Find(x => x.name == name).ID,
				action = 1,
		} catch {
	/*************************************************************************************************/

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

WPF右键点击ListView或TreeView时,是无法选中当前项的。当我们想在ListViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该项,以使得菜单针对当前项生效。 右键菜单是很常用的一种功能,能够为用户操作带来不少便捷。那么WPF中应该如何为控件添加右键菜单呢?其实很简单,新手用一次就知道了。 WPF中很多控件都有一个ContextMenu的属性,在添加控件的时候,定义一个ContextMenu菜单控件,然后赋值给控件的ContextMenu属性就可以了。如下: ContextMenu aMenu = new ContextMenu(); 很多项目都涉及到导航栏的用法,我在做WPF项目的时候也遇到了这样头疼的问题。既要美观又要实用。想了很多种菜单和导航栏的样式和方法,奈何技术有限实现不了。无奈选择了最简便的一种,点击父菜单,显示菜单。用的是MVVM框架,所以代码实现在viewmodel中。 代码如下: 因为使用的mvvm框架所以我们用命令代替事件: 给出入院按钮一个命令, 有了事件之后我们需要visibility的属性,所以我们需要在viewmodel后台声明属性 将属性绑定到前台 然后我们就可以写方法了: Visible表示显示, hello,今天和大家分享移动端菜单合集,里面包括了常用菜单页面、侧栏菜单、弹窗菜单、锚点菜单、顶部标签菜单、和底部标签菜单。然后除了底部和锚点菜单外,其余菜单都是用中继器制作的,交互效果啥的都设置好了,大家只需要填写中继器表格即可使用,非常方便。该原型axure8、9通用原型预览及下载地址:https://www.pmdaniu.com/storages/120856/4f94907795d7b... public class MyButton : Button public static readonly DependencyProperty DisplayImageProperty = DependencyProperty.Register("DisplayImage", typeof(