2010-02-06 121 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