Значок?. символ интересен, потому что когда вы щелкаете правой кнопкой мыши на элементе с помощью мыши, это нормально. Но когда вы «нажали правой кнопкой мыши» элемент с помощью кнопки меню (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);
}
}