LongListSelector: Кран пункта?
Я использую элемент управления LongListSelector на Windows Phone 8 и не могу определить лучший способ обращения с краном по элементу.
Несколько примеров, которые я нашел, полагаются на событие SelectionChanged. Однако это решение является ошибкой, потому что, если я нажимаю элемент, который открывает новую страницу, нажимает назад, а затем снова нажимает тот же элемент, он не будет работать, потому что этот элемент уже выбран, поэтому SelectionChanged не запускается.
Я попытался зарегистрироваться на событие крана и использовать текущий выбранный элемент в качестве постученного, но несколько раз текущий выбранный элемент не тот, который я ожидаю.
Я мог бы обернуть свой ItemTemplate кнопкой и обработать касание для каждого элемента, но мне нужно переустановить кнопку, чтобы она выглядела как простой элемент списка.
Наконец, я не понимаю, почему так сложно достичь такой основной вещи. Есть ли простой и стандартный способ, который я пропустил?
Мое второе желание состоит в том, чтобы получить эффект от элемента при его прослушивании. Есть ли стандартный способ сделать это?
Ответы
Ответ 1
Вы можете null
ваш LongListSelector SelectedItem
в конце каждого события SelectionChanged
. То есть.
<phone:LongListSelector x:Name="LLS" SelectionChanged="LLS_SelectionChanged">
И обработчик событий:
private void LLS_SelectionChanged(object sender, SelectionChangedEventArgs e) {
// If selected item is null, do nothing
if (LLS.SelectedItem == null)
return;
// Navigate to the next page
NavigationService.Navigate(new Uri("/nextpage.xaml", UriKind.Relative));
// Reset selected item to null
LLS.SelectedItem = null;
}
Вы дважды запускаете событие SelectionChanged, но ничего не произойдет во второй раз, и вы должны получить поведение, которое вы ищете - (например, Setting SelectedItem
to null
вызовет новый SelectionChanged
, но это второе событие попадает в if-statement)
Что касается второй части вашего вопроса, возможно, вам лучше разместить новый вопрос.
Ответ 2
Я сделал это с обработкой Tap event.
Я предпочитаю не использовать свойство Selected, но получаю tapped item таким образом (и я не заметил никаких ошибок):
MyListItemClass item = ((FrameworkElement)e.OriginalSource).DataContext
as MyListItemClass;
Кроме того, вы можете легко получить исходный элемент ContentPresenter, перейдя через VisualTree из e.OriginalSource. Таким образом:
ContentPresenter itemPresenter = SomeHelperClass
.FindParent<ContentPresenter>(e.OriginalSource,"");
Где FindParent похож на поиск child в этом вопросе: Как я могу найти элементы управления WPF по имени или типу?
ContentPresenter - это тот объект, который вам нужен, чтобы вручную изменить шаблон элемента, если вы хотите (например, установить "выбранное" состояние).
Ответ 3
private void Item_tap(object sender, RoutedEventArgs e)
{
var element = (FrameworkElement)sender;
DataSource data = (DataSource)element.DataContext;
}
Ответ 4
Мое второе желание состоит в том, чтобы получить эффект от элемента при его прослушивании. Является есть ли стандартный способ сделать это?
Для этого вам нужно только добавить это в свой элемент управления (или в стеке, где вы хотите получить этот эффект):
<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
Ответ 5
сначала добавьте это на страницу *.xaml внутри
LongListSelectorSelectionChanged="listBox_SelectionChanged"
чтобы он выглядел так:
<toolkit:LongListSelector x:Name="listBox" SelectionChanged="listBox_SelectionChanged">
то в файле *.xaml.cs в обработчике событий
private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Write your logic on what you want to do with the selected item
}
Ответ 6
В дополнение к ответу halil:
Прежде всего, вам необходимо установить набор инструментов Windows Phone Toolkit (WPtoolkit) от NuGet.
Затем добавьте объявление пространства имен в PhoneApplicationPage.
xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
После этого вы можете добавить toolkit:TiltEffect.IsTiltEnabled="True"
в определение элемента управления.
Приятно документировать NOKIA:
http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone
Оливер