Как я могу препятствовать тому, чтобы ListBox выбрал объект, когда я щелкаю правой кнопкой по нему?

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

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

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

7
задан devios1 9 June 2010 в 23:30
поделиться

1 ответ

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

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

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

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

Однако это не работает, если вы хотите, чтобы указатель мыши обрабатывался где-то еще в вашем 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, поскольку событие напрямую направляется каждому элементу управления индивидуально
20
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: