ContextMenuStrip的不稳定行为

时间:2010-02-06 09:50:03

标签: c# .net winforms contextmenustrip

我从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;
 }
  1. 显示上下文菜单时,未正确选择列表视图中的项目。换句话说,当选择项目时,细节字符串值将显示在标签控件中。
  2. 如果显示上下文菜单,并且选择了某个项目,则项目详细信息不会更改。
  3. 上下文菜单位置会短暂显示在鼠标位置,然后移至鼠标位置。
  4. 我的上下文菜单有问题吗?

1 个答案:

答案 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位置对象。