Как я могу запретить ListBox выбирать элемент, когда я щелкаю его правой кнопкой мыши? - PullRequest
7 голосов
/ 10 июня 2010

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

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

Я думаю простопереключение на ItemsControl на самом деле, пока я могу настроить виртуализацию и прокрутку для работы с ней.

1 Ответ

19 голосов
/ 10 июня 2010

Если вы вообще не хотите выбирать, я бы определенно остановился на ItemsControl, а не на ListBox.И виртуализацию, и прокрутку можно использовать с простым ItemsControl, если они находятся в шаблоне.

С другой стороны, если вам нужен выбор, но вы просто не хотите, чтобы щелкнул правой кнопкой мыши, самый простой способвероятно, для обработки события PreviewRightMouseButtonDown:

void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e)
{
  e.Handled = true;
}

Причина, по которой это работает, заключается в том, что выбор ListBoxItem происходит при нажатии мыши вниз , а при открытии контекстного меню - при нажатии мыши up .Поэтому устранение события нажатия мыши на этапе предварительного просмотра решает вашу проблему.

Однако это не работает, если вы хотите, чтобы указатель мыши обрабатывался в другом месте вашего ListBox (например, в элементе управления внутри элемента).В этом случае, возможно, самый простой способ - создать подкласс ListBoxItem, чтобы игнорировать его:

public class ListBoxItemNoRightClickSelect : ListBoxItem
{
  protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
  {
  }
}

Вы можете либо явно создать эти ListBoxItems в вашем ItemsSource, либо вы также можете создать подкласс ListBox для автоматического использования ваших пользовательских элементов:

public class ListBoxNoRightClickSelect : ListBox
{
  protected override DependencyObject GetContainerForItemOverride()
  {
    return new ListBoxItemNoRightClickSelect();
  }
}

Кстати, вот некоторые решения, которые не будут работать вместе с объяснениями, почему они не будут работать:

  • Вы не можете просто добавить обработчик MouseRightButtonDown для каждого ListBoxItem, потому чтообработчик зарегистрированного класса будет вызван раньше, чем ваш
  • Вы не можете обрабатывать MouseRightButtonDown в ListBox, потому что событие направляется непосредственно каждому элементу управления
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...