【问题标题】:Erratic behavior from ContextMenuStrip来自 ContextMenuStrip 的不稳定行为
【发布时间】:2010-02-06 09:50:02
【问题描述】:

我从 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. 上下文菜单位置短暂出现在鼠标位置,然后移动到鼠标位置。

上下文菜单有什么问题吗?

【问题讨论】:

    标签: c# .net winforms contextmenustrip


    【解决方案1】:

    我尽量重现您的问题。我想我可以帮助您解决您列出的三个问题中的至少两个。

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

    【讨论】:

    • 很明显,你是个天才。我想在这种情况下我看不到森林……谢谢!!!
    猜你喜欢
    • 2013-02-24
    • 2011-01-27
    • 2019-08-02
    • 1970-01-01
    • 2012-04-24
    • 2011-04-24
    • 2015-08-19
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多