代码之家  ›  专栏  ›  技术社区  ›  IAbstract

ContextMenuStrip的异常行为

  •  2
  • IAbstract  · 技术社区  · 15 年前

    我从一个 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. 上下文菜单位置短暂显示在 古老的 鼠标位置然后移动到 新的 鼠标位置。

    上下文菜单有问题吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   stakx - no longer contributing Saravana Kumar    15 年前

    我尽量再现你的问题。我想我至少能帮你解决你列出的三个问题中的两个。

    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;
        }
    }
    

    三。上下文菜单位置短暂地显示在旧的鼠标位置,然后移动到新的鼠标位置。

    我相信你做的太多了。让框架处理通过 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 位置对象。

    推荐文章