【WPF】右键菜单ContextMenu可点击区域太小的问题
原文:【WPF】右键菜单ContextMenu可点击区域太小的问题

问题描述

正常使用右键菜单ContextMenu时,如果菜单项是不变的,可以直接在XAML中写死,如下是给一个Button按钮添加了右键菜单功能。

<Button Content="Test" Width="100" Height="30"><Button.ContextMenu><ContextMenu><MenuItem Header="1"/><MenuItem Header="1123"/><MenuItem Header="11234134532"/><MenuItem Header="1234532"/><MenuItem Header="1234"/><MenuItem Header="13245324532543253"/></ContextMenu></Button.ContextMenu>
</Button>

此时整个MenuItem菜单项都是可以响应点击的。

然而项目中通常右键菜单项MenuItem的内容是不固定的,是通过ItemsSource绑定了集合。集合使用的数据内容是可以动态修改的,在XAML中只是写数据模板ItemTemplate。代码改造一下如下。

XAML:ItemSource绑定列表DataList,MenuItem中显示的是DataList集合中的每个自定义对象的Num属性。

<Button Content="Test" Width="100" Height="30"><Button.ContextMenu><ContextMenu ItemsSource="{Binding DataList, Mode=TwoWay}"><ContextMenu.ItemTemplate><DataTemplate><MenuItem Header="{Binding Num}"Command="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=DataContext.YourCommand}" CommandParameter="{Binding RelativeSource={x:Static RelativeSource.Self}}"/></DataTemplate></ContextMenu.ItemTemplate></ContextMenu></Button.ContextMenu>
</Button>

自定义的实体类Student.cs。

public class Student
{public string Num { get; set; }public int Age { get; set; }
}

ViewModel:定义DataList集合。

private ObservableCollection<Student> dataList;
public ObservableCollection<Student> DataList
{get { return dataList; }set { dataList = value; }
}

给DataList填充数据。

DataList = new ObservableCollection<Student>();
DataList.Add(new Student() { Num = "12", Age = 10});
DataList.Add(new Student() { Num = "12213", Age = 10 });
DataList.Add(new Student() { Num = "1212", Age = 10 });
DataList.Add(new Student() { Num = "2", Age = 10 });
DataList.Add(new Student() { Num = "112341242134122", Age = 10 });
DataList.Add(new Student() { Num = "123452342", Age = 10 });

运行后即可发现问题。

仔细观察上图运行效果,每个菜单项是嵌套在条目内部的,只有点击到中间深色区域才能触发菜单项的点击事件!点击左右两端浅色部分也能使菜单项关闭,但不会触发菜单项的点击事件!

解决方案

最初的想法是给内部被嵌套的MenuItem改样式,改为Padding=0应该就能使其扩大到紧贴整个条目区域。

<Button Content="Test" Width="100" Height="30"><Button.ContextMenu><ContextMenu ItemsSource="{Binding DataList, Mode=TwoWay}"><ContextMenu.ItemContainerStyle><Style TargetType="{x:Type MenuItem}"><Setter Property="Padding" Value="-33,0,-63,0"/></Style></ContextMenu.ItemContainerStyle><ContextMenu.ItemTemplate><DataTemplate><MenuItem Header="{Binding Num}" Command="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=DataContext.YourCommand}" CommandParameter="{Binding RelativeSource={x:Static RelativeSource.Self}}"/></DataTemplate></ContextMenu.ItemTemplate></ContextMenu></Button.ContextMenu>
</Button>

通过ContextMenu.ItemContainerStyle设置样式的Padding属性后,看上去菜单项已经覆盖了整个条目,但点击时依然是左右两端无法响应点击事件,只有中间部分能响应到!(测试的点击事件已被绑定到YourCommand命令中,此处已省略)

谷歌一下,看看别人是怎么处理该问题的。

参考:

  1. https://social.msdn.microsoft.com/Forums/vstudio/en-US/188e6bad-352a-4e7d-a3bb-0a88f7760529/datatemplate-can-not-access-menuitemclick-attribute?forum=wpf
  2. https://stackoverflow.com/questions/44763405/c-sharp-wpf-contextmenu-menuitem-does-not-react-to-click

上面第一篇文章中,老外的意见是不要在ItemTemplate中嵌套MenuItem,改为嵌套TextBlock。试了一下发现没用。。

根据第二篇中的回复,改为不用DataTemplate,完全在ContextMenu.ItemContainerStyle中设置菜单项的属性,试用后生效了。

<Button Content="Test" Width="100" Height="30"><Button.ContextMenu><ContextMenu ItemsSource="{Binding DataList, Mode=TwoWay}" Padding="0"><!-- 消除ItemTemplate造成的内部MenuItem嵌套,导致左右两端无法响应点击的问题 --><ContextMenu.ItemContainerStyle><Style TargetType="{x:Type MenuItem}"><Setter Property="Header" Value="{Binding Num}"/><Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=DataContext.YourCommand}"/><Setter Property="CommandParameter" Value="{Binding RelativeSource={x:Static RelativeSource.Self}}"/></Style></ContextMenu.ItemContainerStyle></ContextMenu></Button.ContextMenu>
</Button>

此时MenuItem菜单项覆盖了整个条目,且点击左右两端都能触发点击事件了!

posted on 2018-09-11 17:05 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9628876.html

【WPF】右键菜单ContextMenu可点击区域太小的问题相关推荐

  1. win10系统右键新建菜单里office报错0x8007007A:传递给系统调用的数据区域太小。

    问题描述: 鼠标右键新建word.excel等office文件时,提示错误:0x8007007A:传递给系统调用的数据区域太小.但原有office文件可正常使用(本人电脑是thinkpad,offic ...

  2. vue-axios下载文件流blob,ie下载报传递给系统调用的数据区域太小.ie文件流下载报错;文件下载失败将blob的错误信息转换成json格式

    本次下载是后台文件流传输,前端下载,前端将拿到的下载id和名称downloadName传递给下载方法:如果是多个下载,可以采用数组for循环 情景描述: 1.如果符合导出条件, 后端直接返回数据流,如 ...

  3. NVIDIA控制面板打开报错,提示nvcplui.exe应用程序错误并显示传递给系统调用的数据区域太小

    打开NVIDIA控制面板时提示错误,提示nvcplui.exe应用程序错误并显示传递给系统调用的数据区域太小 解决方法:打开报错提示中程序所在路径 我电脑对应路径如下图所示 在电脑中进入对应路径,可能 ...

  4. 传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A)

    传递给系统调用的数据区域太小. (异常来自 HRESULT:0x8007007A) 参考文章: (1)传递给系统调用的数据区域太小. (异常来自 HRESULT:0x8007007A) (2)http ...

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

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

  6. WPF中的右键菜单ContextMenu

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

  7. WPF右键菜单动态传值

    菜单 简介 安装 Newtonsoft.Json.dll 1.VS安装 2.网页下载 代码实现 1. 窗体 2.后台代码动态绑定右键菜单以及事件传对象 关键代码 小结 简介 在工作WPF项目中需要给图 ...

  8. java 树 右键菜单_VUE实现Studio管理后台(八):用右键菜单contextmenu,编辑树形结构...

    RXEdior预设会有文件管理功能,但是灵活性需求不大,目前的设想是文件夹不允许修改,只允许增删改文件.基于这样的设想,把界面实现成这个效果: 这个功能并不是一个通用功能,并且我们做的代码,也没有按照 ...

  9. jqGrid 右键菜单contextmenu简单实现

    鼠标右键单击表格弹出快捷菜单可以查看.编辑.新增.删除行记录,这是很多项目的常见操作,jqGrid也可以实现类似功能,本案例依赖:bootstrap-contextmenu,该项目比较老了作者已经不维 ...

最新文章

  1. MVC框架浅析(基于PHP)
  2. c语言 搜索题油田问题,HDU1241 经典油田问题(BFS)
  3. Python开发【第六篇】:模块
  4. 开辟 Dart 到 Native 的超级通道,饿了么跨平台的最佳实践
  5. 计算机大学英语值最高的3项,计算机等级考试一级B上机试题:Windows字处理
  6. 带外壳版本4G LTE模块,包括华为ME909系列、移远EC20系列、移远EC200T系列
  7. 卷积神经网络--MINIST数据集
  8. 【转载】男生追女生必发的48条短信
  9. 最终幻想java中文版_【个人翻译系列】java版FF2(最终幻想二代)英文剧情(第九期)...
  10. __dict__属性详解
  11. matlab tcpip数据解析,Matlab数据输出、从MATLAB 以tcpip形式传输数据到 vvvv
  12. 人工智能将改变教育的未来:让我们变得更聪明
  13. 【没有哪个港口是永远的停留~ 论文解读】OverFeat
  14. 基于Java毕业设计学生学籍信息管理系统源码+系统+mysql+lw文档+部署软件
  15. Java输出时间为12小时制,带上PM/AM 或 上午/下午
  16. 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。
  17. C# EF查询结果转换成子类 SelectToType
  18. 基于两阶段鲁棒优化的微网电源储能容量优化配置
  19. P2P之UDP穿透NAT的原理与实现 [转]
  20. 干货!BMS电池管理系统均衡设计,有效延长电池使用寿命

热门文章

  1. matlab 主成分 分类,matlab主成分分析
  2. php curl的数据后台如何接收,PHP curl以模拟put请求,后台无法接受到数据是怎么回事?...
  3. 【CentOS7】安装 mysql client 5.7
  4. nginx 查看 $1,$2,$3
  5. php cookie加密 类,PHP cookie加密类
  6. jvm学习笔记(一)
  7. 中法线如何反转_凹凸贴图、法线贴图、置换贴图傻傻分不清?
  8. 服务器用户编码是什么,涨知识:英特尔服务器CPU编号是啥意思?
  9. mysql2008安装中文_Microsoft SQL Server 2008 R2 中文安装说明
  10. PyTorch教程(十):单层感知机以及梯度更新