2010-02-06 3 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; 
     } 
    } 
} 

Btw., Если это работает, вы можете также избавиться от lstModules_MouseMove обработчика события и объекта mouse местонахождения.

+0

Очевидно, что вы гений. Наверное, я не мог увидеть лес для деревьев в этом случае ... thx !!! – IAbstract