WPF ListView обрабатывает одиночный и двойной щелчок по-разному

#c# #wpf #listview

#c# #wpf #listview

Вопрос:

У меня есть представление списка с некоторыми элементами и стилем, который указывает, что при щелчке по элементу свойство IsSelected изменится. Смотрите отрывок кода ниже.

В настоящее время это выделяет / выделяет элемент и выполняет действие, связанное с этим элементом, при нажатии на него в списке. Теперь я хочу изменить поведение так, чтобы это происходило при двойном щелчке вместо одного щелчка. Кроме того, при одиночном щелчке по элементу этот элемент также должен быть выбран / выделен, но действие, связанное с этим элементом, не выполняется, так что пользователь может выбрать несколько элементов, щелкнув по ним одним щелчком мыши (аналогично тому, как вы обычно выполняете ctrl-click), а затем выполнить все действия одновременно.один раз, когда выбраны нужные элементы и нажата какая-то кнопка.

Я должен также упомянуть, что я использую шаблон MVVM, поэтому в файле с кодом нет кода. Любой код будет помещен в файл ItemListViewModel.cs.

Я подозреваю, что мне пришлось бы Command каким-то образом использовать? Я также нашел атрибут для вызова ListView MouseDoubleClick="" , однако это не заменит функциональность одного клика, а только дополнит ее.

У кого-нибудь есть идея, как заставить это работать?

  <ListView Grid.Row="0" x:Name="ItemsList" 
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                  ScrollViewer.CanContentScroll="True"
                  ScrollViewer.VerticalScrollBarVisibility="Visible" 
                  VirtualizingPanel.IsVirtualizing="True" 
                  VirtualizingPanel.VirtualizationMode="Recycling" 
                  ScrollViewer.IsDeferredScrollingEnabled="True" 
                  ItemsSource="{Binding FilteredItems}"
                  SelectionMode="Extended">
            <ListView.Resources>
                <Style TargetType="{x:Type ListViewItem}" >
                    <Setter Property="IsSelected" Value="{Binding Selected, Mode=TwoWay}"/>
                </Style>
            </ListView.Resources>
 </ListView>
 

Ответ №1:

Для описания поведения выбора взгляните на SelectionMode . Вы можете установить ListView.SelectionMode значение Multiple , которое похоже на поведение, которое вы описываете.

Для двойного щелчка вы можете использовать MouseDoubleClick событие или попробовать использовать привязку мыши, которая позволяет использовать ICommand s вместо событий (на странице InputBinding есть несколько хороших примеров).

Однако вам придется протестировать, чтобы увидеть, как все работает вместе. Обработка как одиночного, так и двойного щелчка может быть сложной, и вам может потребоваться обработать PreviewMouseDown событие и сделать все вручную (наихудший сценарий).

Комментарии:

1. Спасибо. На данный момент я поставил двойной щелчок на паузу. Однако я пытаюсь изменить поведение щелчка shift и щелчка ctrl. На данный момент при одиночном щелчке по элементу этот элемент отображается в окне. Это желательно. Затем я хочу выбрать несколько элементов, щелкнув shift или ctrl, а затем показать их все сразу при нажатии другой кнопки. Тем не менее, элемент мгновенно отображается в окне, когда я также нажимаю ctrl, потому что приложение регистрирует обычный щелчок левой кнопкой мыши в дополнение к щелчку ctrl. Как я могу удалить поведение с одним щелчком мыши из ctrl-click?