2010-02-06 85 views
2

我从ContextMenuStip得到一些奇怪的行为:古怪行为从的ContextMenuStrip

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

有没有我做错了上下文菜单?

回答

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

+0

显然,你是一个天才。我想我在这种情况下看不到树木的森林...... thx! – IAbstract 2010-02-06 16:45:49