Хитрая часть - то, что каждый объект имеет a ContextMenu
то, что я все еще хочу открыться, когда по этому щелкают правой кнопкой (я просто не хочу это выбирающий его).
На самом деле, если это делает вещи немного легче, я не хочу автоматического выбора вообще, поэтому если бы существует некоторый способ, которым я могу отключить его полностью, который был бы очень хорошо.
Я думаю о просто переключении на ItemsControl
на самом деле, пока я могу заставить виртуализацию и прокрутку работать с ним.
Если вам вообще не нужен выбор, я определенно выбрал бы 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();
}
}
К вашему сведению, вот несколько решений это не будет работать вместе с объяснениями, почему они не будут работать: