WPF Listview модификация - PullRequest
       12

WPF Listview модификация

1 голос
/ 11 января 2010

По очень конкретной причине я хочу выбрать ListViewItem s при нажатии кнопки вверх, а не при нажатии кнопки мыши. Я хочу, чтобы это поведение было встроено в элемент управления. Возможно ли этого добиться? кто-нибудь может дать подсказку?

Ответы [ 2 ]

3 голосов
/ 11 января 2010

Да, это определенно возможно с использованием прикрепленных свойств. Определите вложенное свойство с именем SelectOnMouseUp и, когда оно установлено в значение true, подключитесь к своим ItemsContainerGenerator событиям, чтобы узнать, когда добавляется новый контейнер элементов. Затем, когда вы получаете событие для нового контейнера элементов, подключитесь к его PreviewMouseDown и проигнорируйте его (установите e.Handled в true), подключитесь к его событию MouseUp и выполните выбор (установите IsSelected на * 1007). *).

2 голосов
/ 12 января 2010

Ответ Авиад П. - хороший и умное использование прикрепленных свойств, но большую часть времени я склонен использовать другую технику:

  1. Подкласс ListViewItem.
  2. Переопределите OnMouseLeftButtonDown и OnMouseRightButton, чтобы ничего не делать.
  3. Переопределите OnMouseLeftButtonUp / OnMouseRightButtonUp для вызова base.OnMouseLeftButtonDown / base.OnMouseRightButtonDown.
  4. Подкласс ListView.
  5. Переопределить 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();
  }
}

Мне нравится эта техника, потому что задействовано меньше кода.

...