Подтвердить что ты не робот

LongListSelector: Кран пункта?

Я использую элемент управления LongListSelector на Windows Phone 8 и не могу определить лучший способ обращения с краном по элементу. Несколько примеров, которые я нашел, полагаются на событие SelectionChanged. Однако это решение является ошибкой, потому что, если я нажимаю элемент, который открывает новую страницу, нажимает назад, а затем снова нажимает тот же элемент, он не будет работать, потому что этот элемент уже выбран, поэтому SelectionChanged не запускается.

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

Я мог бы обернуть свой ItemTemplate кнопкой и обработать касание для каждого элемента, но мне нужно переустановить кнопку, чтобы она выглядела как простой элемент списка.

Наконец, я не понимаю, почему так сложно достичь такой основной вещи. Есть ли простой и стандартный способ, который я пропустил?

Мое второе желание состоит в том, чтобы получить эффект от элемента при его прослушивании. Есть ли стандартный способ сделать это?

4b9b3361

Ответ 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

Оливер