Если вы вообще не хотите выбирать, я бы определенно остановился на 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, потому что событие направляется непосредственно каждому элементу управления