求助如何获取WPF根据右键菜单的源控件

opencv_newers 2019-06-14 10:17:28
附上代码:
private void new_Click(object sender, RoutedEventArgs e)
{
Node LoopNode = new Node()
{
NodeName = "New",
IsExpanded = true

};

//var treeViewItem = ((e.Source as MenuItem).Parent as ContextMenu).PlacementTarget as TreeViewItem;
var treeViewItem = ContextMenuService.GetPlacementTarget(HelLogicalTreeper.GetParent(sender as MenuItem) as TreeViewItem;
BindingExpression bindingdata = treeViewItem.GetBindingExpression(TreeView.ItemsSourceProperty);
var node = bindingdata.DataItem as Node;
node.Children.Add(LoopNode);
this.Tree.ItemsSource = children;
}

调试监控发现treeViewItem总是为null,求大佬帮助
...全文
4095 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lionheart922 2019-06-19
  • 打赏
  • 举报
回复
WPF里一般不都不用事件的吗?用command绑定
xyb* 2019-06-16
  • 打赏
  • 举报
回复
鼠标点击的控件会获取焦点,这是必然的。
  • 打赏
  • 举报
回复
获取选择的item,并不是非得需要获取到控件。对于treeview来说,数据之间应该建立从属关系,该关系建立之后,直接操作item对应的数据对象就行了,对于新增,将新的数据对象,插入到当前选择对象的子集中,更新显示即可。
OrdinaryCoder 2019-06-14
  • 打赏
  • 举报
回复
那你的右键菜单没添加到TreeView子节点上 添加到什么上了? 为什么右键TreeView可以弹菜单 应该是有关联的啊
opencv_newers 2019-06-14
  • 打赏
  • 举报
回复
引用 6 楼 OrdinaryCoder 的回复:
先取menuItem对象 var item = sender as System.Windows.Controls.MenuItem; 之后通过item.Parent获取父级控件 直到取到你想要的 不知道类型可以先用var接一下 比如 var parent=item.Parent;
你那个是从视觉树上找所需要的控件,但是这个右键菜单我在视觉树上没看到
OrdinaryCoder 2019-06-14
  • 打赏
  • 举报
回复
先取menuItem对象 var item = sender as System.Windows.Controls.MenuItem;
之后通过item.Parent获取父级控件 直到取到你想要的 不知道类型可以先用var接一下
比如 var parent=item.Parent;
qq14923349 2019-06-14
  • 打赏
  • 举报
回复
一般思路从controls里面找
opencv_newers 2019-06-14
  • 打赏
  • 举报
回复
我是在xaml写的,在后台绑定个Node类,这个是一个TreeViewItem的右键菜单,通过后台对树节点的增删,这个只是部分代码
OrdinaryCoder 2019-06-14
  • 打赏
  • 举报
回复
1.是要点击右键菜单的某一个选项 在事件中获取一下父级控件?
2.你这和菜单是怎么加上的是在xaml还是在后台
opencv_newers 2019-06-14
  • 打赏
  • 举报
回复
opencv_newers 2019-06-14
  • 打赏
  • 举报
回复
这是我的截图
sorrysor 2019-06-14
  • 打赏
  • 举报
回复
学习才是我应该的
  • 打赏
  • 举报
回复
鼠标点击的控件会获取焦点,这是必然的。
opencv_newers 2019-06-14
  • 打赏
  • 举报
回复
引用 19 楼 exception92 的回复:
[quote=引用 18 楼 OrdinaryCoder 的回复:] [quote=引用 16 楼 exception92 的回复:] [quote=引用 15 楼 OrdinaryCoder 的回复:] [quote=引用 13 楼 exception92 的回复:] 参见:https://blog.csdn.net/duanzi_peng/article/details/17094639 中的方法即可。
用SelectItem我也想到了 但是我测试有个问题就是 想要取到正确的选中项 必须是左键点一下 之后再右键 当你左键选中一个节点 在另一个节点右键菜单时 这个选中项就是左键选中的那个 所以我觉得 右键菜单还是跟在TreeViewItem下面好 直接就可以取到[/quote] 如果是几百个item,都有对应的contextmenu,我觉得是不可取的。本身,右键菜单就是对选中的项进行操作,多点击一下不为过吧。 除非在鼠标在悬浮的过程中,将悬浮的item同时设置为选中。[/quote] 我还是觉得应该每一个TreeViewItem对应一个contextmenu 毕竟你不能因为为了方便开发而去让用户进行繁琐的操作 左键选中一下对于我们可能没什么 但是对于不懂技术的用户 可能就不太注意了 就会造成操作错误的节点 自定义一个带右键菜单的自定义控件或者TreeViewItem模板 我觉得还可以吧[/quote] 自定义一个是完全可以的。[/quote] 你们说的那个问题我已经开发好了,左键点击或者右键点击焦点自动在所点击的控件上,但是还是前面的问题,右键点击弹出右键菜单时,焦点自动到右键菜单的MenuItem上了。
opencv_newers 2019-06-14
  • 打赏
  • 举报
回复
详情见https://blog.csdn.net/bitfan/article/details/3963817?utm_source=blogxgwz4
  • 打赏
  • 举报
回复
引用 18 楼 OrdinaryCoder 的回复:
[quote=引用 16 楼 exception92 的回复:] [quote=引用 15 楼 OrdinaryCoder 的回复:] [quote=引用 13 楼 exception92 的回复:] 参见:https://blog.csdn.net/duanzi_peng/article/details/17094639 中的方法即可。
用SelectItem我也想到了 但是我测试有个问题就是 想要取到正确的选中项 必须是左键点一下 之后再右键 当你左键选中一个节点 在另一个节点右键菜单时 这个选中项就是左键选中的那个 所以我觉得 右键菜单还是跟在TreeViewItem下面好 直接就可以取到[/quote] 如果是几百个item,都有对应的contextmenu,我觉得是不可取的。本身,右键菜单就是对选中的项进行操作,多点击一下不为过吧。 除非在鼠标在悬浮的过程中,将悬浮的item同时设置为选中。[/quote] 我还是觉得应该每一个TreeViewItem对应一个contextmenu 毕竟你不能因为为了方便开发而去让用户进行繁琐的操作 左键选中一下对于我们可能没什么 但是对于不懂技术的用户 可能就不太注意了 就会造成操作错误的节点 自定义一个带右键菜单的自定义控件或者TreeViewItem模板 我觉得还可以吧[/quote] 自定义一个是完全可以的。
OrdinaryCoder 2019-06-14
  • 打赏
  • 举报
回复
引用 16 楼 exception92 的回复:
[quote=引用 15 楼 OrdinaryCoder 的回复:]
[quote=引用 13 楼 exception92 的回复:]

参见:https://blog.csdn.net/duanzi_peng/article/details/17094639 中的方法即可。

用SelectItem我也想到了 但是我测试有个问题就是 想要取到正确的选中项 必须是左键点一下 之后再右键 当你左键选中一个节点 在另一个节点右键菜单时 这个选中项就是左键选中的那个 所以我觉得 右键菜单还是跟在TreeViewItem下面好 直接就可以取到[/quote]
如果是几百个item,都有对应的contextmenu,我觉得是不可取的。本身,右键菜单就是对选中的项进行操作,多点击一下不为过吧。
除非在鼠标在悬浮的过程中,将悬浮的item同时设置为选中。[/quote]
我还是觉得应该每一个TreeViewItem对应一个contextmenu 毕竟你不能因为为了方便开发而去让用户进行繁琐的操作 左键选中一下对于我们可能没什么 但是对于不懂技术的用户 可能就不太注意了 就会造成操作错误的节点 自定义一个带右键菜单的自定义控件或者TreeViewItem模板 我觉得还可以吧
opencv_newers 2019-06-14
  • 打赏
  • 举报
回复
引用 16 楼 exception92 的回复:
[quote=引用 15 楼 OrdinaryCoder 的回复:] [quote=引用 13 楼 exception92 的回复:] 参见:https://blog.csdn.net/duanzi_peng/article/details/17094639 中的方法即可。
用SelectItem我也想到了 但是我测试有个问题就是 想要取到正确的选中项 必须是左键点一下 之后再右键 当你左键选中一个节点 在另一个节点右键菜单时 这个选中项就是左键选中的那个 所以我觉得 右键菜单还是跟在TreeViewItem下面好 直接就可以取到[/quote] 如果是几百个item,都有对应的contextmenu,我觉得是不可取的。本身,右键菜单就是对选中的项进行操作,多点击一下不为过吧。 除非在鼠标在悬浮的过程中,将悬浮的item同时设置为选中。[/quote] 您好,我在这边测试的时候发现右键菜单弹出时,焦点跑到MenuItem上去了,还有那个treeview.SelectedItem选中的时候不是TreeViewItem控件本身,而是控件所绑定的Node数据对象。
  • 打赏
  • 举报
回复
引用 15 楼 OrdinaryCoder 的回复:
[quote=引用 13 楼 exception92 的回复:] 参见:https://blog.csdn.net/duanzi_peng/article/details/17094639 中的方法即可。
用SelectItem我也想到了 但是我测试有个问题就是 想要取到正确的选中项 必须是左键点一下 之后再右键 当你左键选中一个节点 在另一个节点右键菜单时 这个选中项就是左键选中的那个 所以我觉得 右键菜单还是跟在TreeViewItem下面好 直接就可以取到[/quote] 如果是几百个item,都有对应的contextmenu,我觉得是不可取的。本身,右键菜单就是对选中的项进行操作,多点击一下不为过吧。 除非在鼠标在悬浮的过程中,将悬浮的item同时设置为选中。
加载更多回复(6)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧