WPF中怎么禁用右键菜单?

梁苏彬 2008-12-08 03:50:47
我在WPF的Treeview中设置了一个ContextMenu,但是我希望在某些情况下让这个菜单不弹出来,请问应该怎么做?
...全文
1237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldy8102 2011-02-22
  • 打赏
  • 举报
回复
很有帮助,多谢,嘿嘿
LorenLiu 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lsbbox 的回复:]
7楼正解,ContextMenuOpening里写e.Handled = true可以完美屏蔽右键菜单。发分。

不过说一下,我不是用7楼的方法判断是否点击在TreeViewItem的,我的代码是
//Set the selected node
private void QueryTree_MouseDown(object sender, MouseButtonEventArgs e)
{
TreeView tv = sender as TreeView;
Point p = e.GetPosition(tv);
Depe…
[/Quote]

恩。是的。思路就是使用e.Handled = true;至于怎么判断,这个就看需要了
梁苏彬 2008-12-09
  • 打赏
  • 举报
回复
思路是在鼠标点击处,在VisualTree上定位到对应的TreeViewItem
梁苏彬 2008-12-09
  • 打赏
  • 举报
回复
7楼正解,ContextMenuOpening里写e.Handled = true可以完美屏蔽右键菜单。发分。

不过说一下,我不是用7楼的方法判断是否点击在TreeViewItem的,我的代码是
//Set the selected node
private void QueryTree_MouseDown(object sender, MouseButtonEventArgs e)
{
TreeView tv = sender as TreeView;
Point p = e.GetPosition(tv);
DependencyObject obj = tv.InputHitTest(p) as DependencyObject;
tviNodeOfMousedown = Utils.Utils.GetDependencyObjectFromVisualTree(obj, typeof(TreeViewItem)) as TreeViewItem;
if (tviNodeOfMousedown == null) return;
}

private DependencyObject GetDependencyObjectFromVisualTree(DependencyObject startObject, Type type)
{
//Iterate the visual tree to get the parent(ItemsControl) of this control
DependencyObject parent = startObject;
while (parent != null)
{
if (type.IsInstanceOfType(parent))
break;
else
parent = VisualTreeHelper.GetParent(parent);
}
return parent;
}

private void QueryTree_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
if (tviNodeOfMousedown == null)
e.Handled = true;
}
LorenLiu 2008-12-08
  • 打赏
  • 举报
回复
补充一点,这个要求TreeView里放的是TreeViewItem
LorenLiu 2008-12-08
  • 打赏
  • 举报
回复
还有一种方法,在ContextMenu的Opening方法中使用:

void treeView1_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
if (e.Source.GetType() != typeof(TreeViewItem))
{
e.Handled = true;
}
}
梁苏彬 2008-12-08
  • 打赏
  • 举报
回复
貌似做不到提前设置,我的情况跟3楼的代码类似,是要在鼠标点击空白处时不显示菜单,点击到TreeViewItem时显示菜单。所以只有鼠标点下去了才能决定。
GTX280 2008-12-08
  • 打赏
  • 举报
回复
在你不需要菜单显示的时候啊,提前设置,不用在按鼠标的时候才设置为false
梁苏彬 2008-12-08
  • 打赏
  • 举报
回复
楼上两位,关键是在什么事件里写这些代码呢?我在PreviewMouseRightButtonDown里写cm.IsEnabled = false;但是菜单会闪出来一下才关闭。(我以前是写cm.IsOpen = false;直接关不掉)
wuyq11 2008-12-08
  • 打赏
  • 举报
回复
if(e.Button == MouseButtons.Right) //鼠标右键
{
if(this.treeView.SelectedNode != null)
{
treeView.ContextMenu = this.contextMenu1;
TreeNodeCollection nodes = this.treeView.Nodes;
}
else
{

}
}
GTX280 2008-12-08
  • 打赏
  • 举报
回复
需要用到的时候再设置为 True 就行了
GTX280 2008-12-08
  • 打赏
  • 举报
回复
Treeview.ContextMenu.IsEnabled = false;

110,566

社区成员

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

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

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