我有一个ListView
控件,它以网格布局显示文件夹中的文件。我有一个包含三个Items
的上下文菜单,其行为应该如下:
- 如果用户右键单击
ListView
中的文件,上下文菜单将显示其所有3个Items
- 如果用户右键单击
ListView
中的空白区域,则上下文视图的第一个Item
应该是不可见的
这是我添加事件和ListView
:的MouseClick
事件代码的地方
this.listviewFiles.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listViewFiles_MouseClick);
private void listViewFiles_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
if (listviewFiles.FocusedItem.Bounds.Contains(e.Location) == true)
{
contextMenuFilesListbox.Items[0].Visible = false;
contextMenuFilesListbox.Items[1].Visible = false;
}
else
{
contextMenuFilesListbox.Items[0].Visible = true;
contextMenuFilesListbox.Items[1].Visible = true;
}
contextMenuFilesListbox.Show(Cursor.Position);
}
}
结果是,当我右键单击listViewFiles_MouseClick
中的空白区域时,根本不会触发事件。因此,我无法在上下文菜单中恢复不可见的Item
。
除非碰到Item
标签,否则MouseClick
不会工作。MouseDown
很好,并且在命中SubItem
标签或空白空间(None
)时也会触发。
最好使用ListViewHitTestInfo
对象来检查您正在命中的内容。
以下是它应该如何工作:
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
ListViewHitTestInfo HI = listView1.HitTest(e.Location);
if (e.Button == MouseButtons.Right)
{
if (HI.Location == ListViewHitTestLocations.None)
{
contextMenuFilesListbox.Items[0].Visible = false;
contextMenuFilesListbox.Items[1].Visible = false;
}
else
{
contextMenuFilesListbox.Items[0].Visible = true;
contextMenuFilesListbox.Items[1].Visible = true;
}
contextMenuFilesListbox.Show(Cursor.Position);
}
}