WPF: навигация и выбор элемента ListView с помощью клавиатуры

У меня есть настольное приложение WPF с ListView, содержащим некоторые элементы.

Я хотел бы получать уведомление, когда элемент щелкается мышью или когда он выбирается с помощью клавиатуры, и пользователь нажимает «Ввод». Требуемое поведение аналогично поведению «Настройки» в современном пользовательском интерфейсе Windows 10 или элементам с правой стороны.

SelectionChanged не будет работать для меня, потому что, когда пользователь перемещается с помощью клавиатуры, я хочу выполнять действие только тогда, когда он нажимает «Ввод».

Есть ли стандартный способ сделать это? Я могу поймать события клавиш/мыши, но это похоже на подозрительное решение.


person Sambusak    schedule 27.03.2017    source источник


Ответы (1)


Есть ли стандартный способ сделать это?

Нет. То, что вы описываете, не является стандартным поведением.

Поскольку элемент в ListView фактически выбирается, когда вы нажимаете клавиши вверх и вниз на клавиатуре (без нажатия ENTER), у вас действительно нет другого выбора, кроме как обрабатывать клавишу и событие мыши, я боюсь.

Но это должно быть довольно легко реализовать. Например, вы можете обработать событие PreviewKeyDown для контейнера ListView и событие PreviewMouseLeftButtonDown для контейнера ListViewItem.

Пожалуйста, обратитесь к следующему примеру кода.

<ListView x:Name="lv" PreviewKeyDown="lv_PreviewKeyDown">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lv_PreviewMouseLeftButtonDown" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

public MainWindow()
{
    InitializeComponent();
    lv.ItemsSource = new List<string> { "1", "2", "3" };
}

private void lv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show((sender as ListViewItem).DataContext.ToString());
}

private void lv_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        MessageBox.Show(lv.SelectedItem.ToString());
    }
}

Это не "рыбно" реализовать какое-то пользовательское поведение :)

person mm8    schedule 27.03.2017
comment
Спасибо. Я подозревал, что должна быть встроенная реализация, которая делает это, потому что сама Windows имеет аналогичное поведение (в современном пользовательском интерфейсе, как я уже упоминал). - person Sambusak; 27.03.2017
comment
Приложение «Настройки» — это приложение UWP, и оно, конечно же, не использует элемент управления WPF ListView. Так что нет, вам придется реализовать эту функциональность самостоятельно. - person mm8; 27.03.2017
comment
Это UWP в порядке, но инструмент проверки показывает, что у него есть класс ListView. Это еще один? - person Sambusak; 28.03.2017