UWP GridView / ListView получает элемент RightTapped с поддержкой мыши и контроллера Xbox. - PullRequest
2 голосов
/ 13 июля 2020

В этом вопросе UWP: как получить элемент GridView RightTapped , есть способ получить элемент, щелкнувший правой кнопкой мыши в GridView (в UWP GridView почти такой же, как ListView):

var student = (e.OriginalSource as FrameworkElement)?.DataContext as Student;

Символ ?. интересен тем, что когда вы щелкаете правой кнопкой мыши на элемент с помощью мыши, это нормально. Но когда вы «нажали правой кнопкой мыши» элемент с помощью кнопки меню (https://en.wikipedia.org/wiki/Menu_key) или с помощью кнопки меню на контроллере Xbox, это будет НЕ нормально, потому что значение равно нулю (на самом деле тип OriginalSource - GridViewItem).

Хотя я нашел решение:

  1. используйте (((GridViewItem)e.OriginalSource).Content as YOUR_ITEM_DATA_TYPE) для обработки кнопки меню
  2. используйте (e.OriginalSource as FrameworkElement)?.DataContext as YOUR_ITEM_DATA_TYPE для управления мышью щелкните правой кнопкой мыши

typeof(e.OriginalSource) можно использовать с if ... else ..., чтобы выбрать, какое решение использовать.

Но действительно ли это лучшее решение? Microsoft разработала UWP и заявила, что она оптимизирована для работы с мышью, клавиатурой, геймпадом, например контроллером Xbox и даже устройством отслеживания движения глаз. Так есть ли лучший способ обработать действие «контекстного меню» (https://docs.microsoft.com/en-us/windows/uwp/design/input/gamepad-and-remote-interactions#accelerator -поддержка )?

Моя цель:

  • осталось щелкните элемент → сделайте что-нибудь со списком элементов [указатель по щелчку]

  • щелкните элемент правой кнопкой мыши → откройте меню, такое как редактировать, удалить → щелкните изменить → сделать что-нибудь со списком элементов [указатель по щелчку правой кнопкой мыши]

PS: попробуйте «Настройки» в Windows 10, он отлично работает, чтобы «щелкнуть правой кнопкой мыши» элемент (чтобы закрепить плитку в меню «Пуск») с помощью мыши, клавиатуры или контроллера Xbox.

1 Ответ

0 голосов
/ 14 июля 2020

Значок?. символ интересен, потому что когда вы щелкаете правой кнопкой мыши на элементе с помощью мыши, это нормально. Но когда вы «нажали правой кнопкой мыши» элемент с помощью кнопки меню (https://en.wikipedia.org/wiki/Menu_key) или с помощью кнопки меню на контроллере Xbox, это НЕ нормально

e.OriginalSource другое введите при щелчке правой кнопкой мыши или нажмите Меню .

Нажмите Меню

e.OriginalSource равно ListViewItem

Щелкните правой кнопкой мыши

e.OriginalSource is ListViewItemPresenter

И именно поэтому (ListViewItem)e.OriginalSource) вызывает исключение при щелчке правой кнопкой мыши по элементу списка. Но оба Content и DataContext of ListViewItemPresenter имеют значение.

Когда вы нажимаете кнопку Menu , соответствующий тип e.OriginalSource будет ListViewItem, а это DataContext равно null.

И вы можете найти некоторые правила, по которым ListViewItemPresenter родительский ListViewItem, и вы можете использовать следующий код, чтобы найти ListViewItemPresenter родителя, когда правильно - щелкните элемент списка и преобразуйте его в ListViewItem.

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

private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
    var orig = e.OriginalSource as DependencyObject;

    while (orig != null && orig != MyListView)
    {
        var lv = orig as ListViewItem;
        if (lv != null)
        {
            var res1 = (lv.Content as string); //string is an example of data binding type of ListViewItem
            //This line will run only if right-tapped on an item, do something here
            break;
        }

        orig = VisualTreeHelper.GetParent(orig);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...