菜单

  • 简介
  • 安装 Newtonsoft.Json.dll
    • 1.VS安装
    • 2.网页下载
  • 代码实现
    • 1. 窗体
    • 2.后台代码动态绑定右键菜单以及事件传对象
  • 关键代码
  • 小结

简介

在工作WPF项目中需要给图片控件添加子元素Label控件,右键点击子元素Label控件,弹出右键菜单,绑定事件,同时把我们需要的ID、等数据作为一个对象传过去。
倒腾了一番后,在下面写了一个小Demo (此Demo代码粘贴即可查看效果,有类似需求的可以根据此代码自己改造 OvO)
效果图:

安装 Newtonsoft.Json.dll

1.VS安装


右键解决方法→管理NuGet程序包

2.网页下载

百度搜索:Newtonsoft.Json 下载即可,下载完成后 如图,添加引用

代码实现

1. 窗体

<!--MainWindow.xaml   窗体--><Window x:Class="Label添加右键菜单.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Label添加右键菜单"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"><Grid Name="GridMain"></Grid>
</Window>

2.后台代码动态绑定右键菜单以及事件传对象

<!--MainWindow.xaml.cs  后台代码-->//序列化与反序列化用到的dll
using Newtonsoft.Json;/// <summary>/// 窗体加载事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Window_Loaded(object sender, RoutedEventArgs e){//Image :    创建显示图像的控件Image img = new Image();img.Width = 200;img.Height = 200;// BitmapImage:    提供专用的 System.Windows.Media.Imaging.BitmapSource,它经过优化,可使用 可扩展应用程序标记语言 (XAML)来加载图像。BitmapImage bimg = new BitmapImage();bimg.BeginInit();bimg.UriSource = new Uri(@"C:\Users\Administrator\Pictures\风景\向日葵.jpg", UriKind.RelativeOrAbsolute);//设置图片路径  此处是相对路径或者绝对路径bimg.EndInit();//绑定到Image图片显示控件上img.Source = bimg;//2.给Image控件 添加 Lable 子控件,同时给Lable添加右键菜单Label label = new Label();label.Content = "Label标记";label.Width = 70;                                             //设置宽label.Height = 28;                                            //设置高label.Background = new SolidColorBrush(Colors.Red);           //设置背景色label.BorderThickness = new Thickness(1);                     //设置边框宽度label.Margin = new Thickness(120,150,50,50);ContextMenu cm = new ContextMenu();//右键菜单控件MenuItem mi = new MenuItem();      //子菜单,可添加多个mi.Header = "删除标记";//声明一个匿名对象,用来传递对象var anonymous = new { MarkId = "03585030-6226-4228-95FE-E958037FCCD3", MarkName = "标记名称1" }; //把数据存为一个匿名对象 然后传给菜单的Tagmi.Tag = JsonConvert.SerializeObject(anonymous);                                                 //Tag属性用于存值,如果用Name属性:值过长,会导致程序报错 超过长度限制mi.Click += MenuItem_Delete;                              //给子菜单绑定  删除事件cm.Items.Add(mi);//给Lable绑定右键菜单 label.ContextMenu = cm;//动态添加到 Grid 控件中GridMain.Children.Add(img);GridMain.Children.Add(label);}/// <summary>/// 右键菜单--子菜单事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MenuItem_Delete(object sender, RoutedEventArgs e){//是否删除标记MessageBoxResult dr = MessageBox.Show("是否删除标记?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);if (dr != MessageBoxResult.OK){return;}//获取当前操作的控件MenuItem menuItem = sender as MenuItem;//准备传过来的匿名对象的格式var anonymous = new { MarkId = String.Empty, MarkName =  String.Empty };//获取传递的删除对象数据var DelObj = JsonConvert.DeserializeAnonymousType((string)menuItem.Tag, anonymous);MessageBox.Show("即将删除标记:\n标记名称:"+DelObj.MarkName+"\n标记ID:"+DelObj.MarkId);//下面进行数据库删除操作等等...}

关键代码

         //序列化数据MenuItem mi = new MenuItem();      //子菜单,可添加多个mi.Header = "删除标记";var anonymous = new { MarkId = "03585030-6226-4228-95FE-E958037FCCD3", MarkName = "标记名称1" }; //把数据存为一个匿名对象 然后传给菜单的Tagmi.Tag = JsonConvert.SerializeObject(anonymous);   //反序列化数据  在事件方法中解析数据    MenuItem menuItem = sender as MenuItem;var anonymous = new { MarkId = String.Empty, MarkName =  String.Empty };var DelObj = JsonConvert.DeserializeAnonymousType((string)menuItem.Tag, anonymous);MessageBox.Show("即将删除标记:\n标记名称:"+DelObj.MarkName+"\n标记ID:"+DelObj.MarkId);

小结

新手上路。

WPF右键菜单动态传值相关推荐

  1. react-contexify 右键菜单动态生成

    react-contexify右键菜单动态生成 如果菜单数量少,并且没有其他地方需要共用菜单列表,建议参考react-contexify的右键菜单属性disabled不起作用 此文中处理方法相对快捷 ...

  2. 【WPF】右键菜单ContextMenu可点击区域太小的问题

    [WPF]右键菜单ContextMenu可点击区域太小的问题 原文:[WPF]右键菜单ContextMenu可点击区域太小的问题 问题描述 正常使用右键菜单ContextMenu时,如果菜单项是不变的 ...

  3. 如何动态添加菜单/菜单项、子菜单、右键菜单

    有关菜单的操作主要用到 CMenu 类,当然也可用相应 API 函数, CMenu 类只是 MFC 对 API 中操作菜单的函数的封装而已. 不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服. ...

  4. 在WPF中弹出右键菜单时判断鼠标是否选中该项

    和上篇在WPF的TreeView中实现右键选定一样,这仍然是一个右键菜单的问题: 这个需求是在一个实现剪贴板的功能的时候遇到的:在弹出右键菜单时,如果菜单弹出位置在ListViewItem中时,我们认 ...

  5. WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法

    WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法 原文:WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法 问题描 ...

  6. WPF中的右键菜单ContextMenu

    WPF中的右键菜单主要是通过ContextMenu来实现,ContextMenu的使用有两种方式 一..在Resources中声明,在控件中使用. 1.在Resources中添加ContextMenu ...

  7. wpf datagrid设置右键菜单打开时选中项的背景色

    原文:wpf datagrid设置右键菜单打开时选中项的背景色 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/huangli321456/artic ...

  8. WPF 与 WinForm 调用系统右键菜单/资源管理器右键菜单/桌面右键菜单

    原本此类是 http://www.codeproject.com 上高手写的 ShellContextMenu 类 但是该类原本貌似是为 WinForm 设计的 ,  默认的命名空间和引用也是 Win ...

  9. wpf 代码获取contextmenu_WPF 如何控制右键菜单ContextMenu的弹出

    在具体做一些项目的时候,有时候需要需要先左键点击某个节点,然后再右键点击节点的时候才弹出右键菜单,所以直接右键点击时需要禁用掉右键菜单,这里比如我们为Grid添加了ContextMenu,但是我们需要 ...

最新文章

  1. 比特币现金是世界上最好货币的十大理由
  2. python怎么画小海龟_Python 海龟 turtle 画图实战任务(一):让小海龟留下Z字形的足迹以及绘制一个小于号<...
  3. 如何深拷贝一个对象数组?
  4. 无线网sdn服务器,什么是SDN,SDN网络与传统网络对比
  5. evplayer2可以多设备登录吗_这么多自助设备,你都选对投放位置了吗
  6. 一点php博客,PHP一点认识
  7. linux drm 内存管理,Linux RK3399 DRM 框架及代码流程 · Younix’s Studio
  8. MultipartFile转为File
  9. SYN Flood攻击及防御方法 (转)
  10. 我的世界Java种子大全_种子(世界生成)
  11. 数学四大思想八大方法_四种思想方法,让你轻松掌握高中数学
  12. 零基础搭建外卖优惠券返利CPS小程序教程
  13. 世界流调——Gary
  14. 聊点高考往事和驾照科目二考试(r12笔记第86天)
  15. 编写MTK6737平台的GPIO驱动例程(二)
  16. 小瓜讲matplotlib高级篇——坐标轴设置(坐标轴居中、坐标轴箭头、刻度设置、标识设置)
  17. 升级笔记本CPU的常见知识汇总
  18. 浅谈SQL注入漏洞原理及利用方式
  19. 智能车竞赛技术报告 | 全向行进组 - 东北林业大学- 进取号E
  20. 4G双卡工业CPE及MIFI

热门文章

  1. Maching Learning
  2. 虚拟机mac 与主机的网络共享
  3. python输入正方形面积公式_scanf()函数的调用:编写求正方形面积的通用程序
  4. 计算机管理员永久访问权限,win7系统账户怎样永久获取管理员权限?
  5. 汇编---智慧交通场景的模拟实现
  6. 优傲协作机器人变身“火眼金睛”质检员
  7. BUAA OS LAB3 实验报告
  8. 大学计算机基础教程魏长宝答案,容易并发脓气胸的是A.肺炎球菌肺炎B.支原体肺炎C.肺炎杆菌肺炎D.绿脓杆菌肺炎E.金黄色葡萄球菌肺...
  9. [附源码]Java计算机毕业设计SSM大学生学习交友平台
  10. java 写文件 二进制_简单Java程序向实用程序的过度:二进制文件的读写