Я пытался воспроизвести вашу проблему настолько, насколько мог. Я думаю, что смогу помочь вам по крайней мере в двух из трех перечисленных вами проблем.
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
объекта местоположения.