我从ContextMenuStip
获得了一些不稳定的行为:
private void lstModules_MouseMove(object sender , MouseEventArgs e)
{ mouse = e.Location; }
private void lstModules_MouseDown(object sender , MouseEventArgs e)
{
ListViewItem item = null;
if((hitTest = lstModules.HitTest(mouse)) != null)
item = hitTest.Item;
switch (e.Button)
{
case MouseButtons.Right:
if (item != null)
{
// valid item selection
ShowModuleDetails(item.Name);
lstModules.ContextMenuStrip = mnuContext_Module;
}
else
{
// right-click - no item selection
lblModuleDetails.Text = string.Empty;
lstModules.ContextMenuStrip = mnuContext_Desktop;
}
lstModules.ContextMenuStrip.Show(lstModules , mouse);
break;
case MouseButtons.Left:
if (item != null)
{ ShowModuleDetails(item.Name); }
break;
}
}
private void ShowModuleDetails(string modName)
{
// get module details from dictionary
lblModuleDetails.Text = Modules[modName].Details;
}
我的上下文菜单有问题吗?
答案 0 :(得分:2)
我试图尽可能地重现你的问题。我想我可以帮助你解决你列出的三个问题中的至少两个问题。
的 1。列表视图中的项目并不总是正确选择。换句话说,选择项目时,标签控件中会显示详细信息字符串值。
通过ListView.ItemSelectionChanged
事件选择项目时,您会收到通知:
//
// this handler's only responsibility is updating the item info label:
//
void lstModules_ItemSelectionChanged(object sender,
ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
{
// an item has been selected; update the label, e.g.:
lblModuleDetails.Text = e.Item.Text;
}
else
{
// some item has been de-selected; clear the label:
lblModuleDetails.Text = string.Empty;
}
}
第3。上下文菜单位置短暂出现在旧鼠标位置,然后移动到新鼠标位置。
我相信你会做太多。让框架处理您通过ListView.ContextMenuStrip
属性指定的上下文菜单的显示。您遇到的效果是由您手动调用ContextMenuStrip.Show(...)
引起的,这会导致框架显示上下文菜单,然后您在另一个位置再次执行相同的操作。
因此,尽量不要调用此函数;上下文菜单仍应出现。
//
// this handler's only responsibility is setting the correct context menu:
//
void lstModules_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var hitTest = lstModules.HitTest(e.Location);
if (hitTest != null && hitTest.Item != null)
{
lstModules.ContextMenuStrip = mnuContext_Module;
}
else
{
lstModules.ContextMenuStrip = mnuContext_Desktop;
}
}
}
顺便说一句,如果有效,您还可以摆脱lstModules_MouseMove
事件处理程序和mouse
位置对象。