Модификация представления списка WPF
-
20-09-2019 - |
Вопрос
По очень конкретной причине я хочу выбрать ListViewItem
s при нажатии кнопки мыши вверх, а не при нажатии кнопки мыши.Я хочу, чтобы это поведение было встроено в элемент управления.Возможно ли этого добиться?может кто-нибудь подсказать?
Решение
Ответ Авиада П. хороший и умное использование присоединенных свойств, но большую часть времени я склонен использовать другой метод:
- Подкласс ListViewItem.
- Переопределите OnMouseLeftButtonDown и OnMouseRightButton, чтобы ничего не делать.
- Переопределите OnMouseLeftButtonUp/OnMouseRightButtonUp для вызова base.OnMouseLeftButtonDown/base.OnMouseRightButtonDown.
- Подкласс ListView.
- Переопределите GetContainerForItemOverride(), чтобы вернуть переопределение ListViewItem.
Мне это кажется проще, чем подписаться на события ItemContainer и динамически добавлять обработчики.
Вот как это выглядит:
public class MouseUpListViewItem : ListViewItem
{
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {}
protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) {}
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
}
protected override void OnMouseRightButtonUp(MouseButtonEventArgs e)
{
base.OnMouseRightButtonDown(e);
}
}
public class MouseUpListView : ListView
{
protected override DependencyObject GetContainerForItemOverride()
{
return new MouseUpListViewItem();
}
}
Мне нравится этот метод, потому что здесь требуется меньше кода.
Другие советы
Да, это определенно возможно, используя прикрепленные свойства.Определите присоединенное свойство под названием SelectOnMouseUp
и когда для него установлено значение true, подключитесь к своему ItemsContainerGenerator
события, позволяющие обнаружить добавление нового контейнера элементов.Затем, когда вы получите событие для контейнера нового элемента, подключитесь к его PreviewMouseDown
и игнорировать его (установить e.Handled
значение true) и подключиться к его MouseUp
событие и выполнить выбор (установить IsSelected
к true
).