我有一个项目的列表视图,我想要它,这样当用户右键单击其中一个项目时,它会弹出一个上下文菜单条,其中包含用户可以执行的一些选项或任务,但我希望它只当一个项目被 r-click 时,带来 contextmenustrip,而不是空白。有这个设置吗?
问问题
7182 次
2 回答
1
你必须自己做。这有点痛苦。基本流程是这样...
- 创建一个名为 contextMenuAllowed 的全局布尔值。
- 订阅 的
MouseDown
事件ListView
。HitTest
使用鼠标的ListView
坐标(eX 和 eY)做一个。如果他们点击了一个项目并且这是一次右键单击,请将 contextMenuAllowed 设置为 true。 - 订阅 的
MouseUp
事件ListView
。如果是鼠标右键,则将 contextMenuAllowed 设置为 false。 - 订阅/的
Opening
事件。如果 contextMenuAllowed 为 false,则将 e.Cancel 设置为 true 并返回。这是阻止上下文菜单实际打开。ContextMenu
ContextMenuStrip
这有点痛苦,但很容易做到,用户永远不会知道其中的区别。
这是一个示例,我刚刚制作了一个新的自定义控件,它将完全符合您的要求:
using System;
using System.Windows.Forms;
public class CustomListView : ListView
{
private bool contextMenuAllowed = false;
public override ContextMenuStrip ContextMenuStrip
{
get
{
return base.ContextMenuStrip;
}
set
{
base.ContextMenuStrip = value;
base.ContextMenuStrip.Opening += ContextMenuStrip_Opening;
}
}
public CustomListView()
{
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ListViewHitTestInfo lvhti = HitTest(e.X, e.Y);
if (lvhti.Item != null)
{
contextMenuAllowed = true;
}
}
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
contextMenuAllowed = false;
}
base.OnMouseUp(e);
}
private void ContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!contextMenuAllowed)
e.Cancel = true;
}
}
于 2013-08-29T18:56:32.257 回答
1
有一个非常简单的方法可以做到这一点:
将上下文菜单分配给 ListView 对象的 ContextMenuStrip 属性(这可以在 GUI 设置中完成)
处理上下文菜单对象的 Opening 事件,并在事件处理程序内部检查是否选择了 ListView 对象的任何项。如果不是这种情况,请取消事件:
If myListView.SelectedItems.Count = 0 Then e.Cancel = True
于 2017-10-16T08:48:00.393 回答