Как я могу запретить ListBox выбирать элемент при щелчке правой кнопкой мыши?
хитрость в том, что каждый элемент имеет ContextMenu
что я все еще хочу открыть, когда он щелкнул Правой Кнопкой Мыши (я просто не хочу, чтобы он выбрал его).
в самом деле, если это делает вещи проще, я не хочу!--5 - >любой автоматический выбор вообще, так что если есть какой-то способ я могу отключить его полностью, что было бы просто замечательно.
Я думаю просто переключиться на ItemsControl
на самом деле, пока я могу получить виртуализацию и прокрутку для работы с ней.
1 ответов
Если вы не хотите выбора вообще, я бы определенно пошел с ItemsControl не ListBox. Виртуализация и прокрутка могут использоваться с простым ItemsControl, пока они находятся в шаблоне.
С другой стороны, если вам нужен выбор, но просто не хотите Правой Кнопкой Мыши, чтобы выбрать, самый простой способ, вероятно, обрабатывать PreviewRightMouseButtonDown событие:
void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}
причина этого заключается в том, что выбор ListBoxItem происходит на мышь вниз но открытие контекстного меню происходит на мыши до. Таким образом, устранение события мыши вниз на этапе предварительного просмотра решает вашу проблему.
однако это не работает, если вы хотите, чтобы мышь вниз обрабатывалась в другом месте в вашем списке (например, в элементе управления в элементе). В этом случае самый простой способ-это, вероятно, подкласс 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();
}
}
FYI, вот некоторые решения, которые не будут работать вместе с объяснениями, почему они не будут работать:
- вы не можете просто добавить обработчик MouseRightButtonDown в каждый ListBoxItem, потому что зарегистрированный обработчик класса будет вызываться перед вашим
- вы не можете обрабатывать MouseRightButtonDown в ListBox, потому что событие напрямую направляется каждому элементу управления индивидуально