2012-02-09 1 views
18

Я пытаюсь создать список элементов, которые вы можете сделать несколькими действиями, щелкнув правой кнопкой мыши и получив контекстное меню. Я закончил это, никаких проблем.Щелкните правой кнопкой мыши, чтобы выбрать элементы в ListBox

Но я хотел бы иметь его так, чтобы при щелчке правой кнопкой мыши на элементе вместо того, чтобы оставить выбранный элемент выбранным, выберите элемент, над которым находится мышь.

Я изучил этот и другие связанные вопросы, и я попытался использовать indexFromPoint (который я нашел в своем исследовании), но всякий раз, когда я нажимаю правой кнопкой мыши на элементе, он всегда просто очищает выбранный элемент и не выполняет покажите контекстное меню, так как я его установил так, чтобы он не отображался, если нет выбранного элемента.

Вот код, который я сейчас использую:

ListBox.SelectedIndex = ListBox.IndexFromPoint(Cursor.Position.X, Cursor.Position.Y); 
+0

это выглядит как ошибка в System.Windows.Forms.ListBox, мы должны сообщить об этом Microsoft. –

ответ

31

ручки ListBox.MouseDown и выберите пункт там. Как это:

private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X, e.Y); 
} 
+4

Если контекстное меню уже ограничен в ListBox, просто использовать: частная пустота listBoxItems_MouseDown (объект отправителя, MouseEventArgs е) { listBoxItems.SelectedIndex = listBoxItems.IndexFromPoint (e.X, e.Y); } –

5

это один работает ...

this.ListBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.List_RightClick); 

private void List_RightClick(object sender, MouseEventArgs e) 
{ 

    if (e.Button == MouseButtons.Right) 
    { 
     int index = this.listBox.IndexFromPoint(e.Location); 
     if (index != ListBox.NoMatches) 
     { 
      listBox.Items[index]; 
     } 
    } 

} 
+0

Только что заменил эту строку listBox.Items [index]; с .SelectedIndex = index; и это работает отлично. –

+0

Странно, что событие click не похоже на правую кнопку или среднюю кнопку. Необходимо использовать MouseUp для их захвата. – MattClimbs

0

Можно также получить такое же поведение, установив событие MouseRightButtonUp на всей ListBox тогда:

private void AccountItemsT33_OnMouseRightButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    // If have selected an item via left click, then do a right click, need to disable that initial selection 
    AccountItemsT33.SelectedIndex = -1; 
    VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), (sender as ListBox)).OfType<ListBoxItem>().First().IsSelected = true; 
}