LongListSelector: Item tap?
Asked Answered
F

6

36

I am using LongListSelector control on Windows Phone 8 and can't figure out the best way to handle a tap on an item. The few examples I've found rely on the SelectionChanged event. However, this solution is buggy because if I tap an item that opens a new page, hit back, and then tap the same item again, it won't work because this item is already selected, so SelectionChanged is not triggered.

I tried to register to the tap event and use the current selected item as the tapped one, but some times the current selected item is not the one I expect.

I could wrap my ItemTemplate in a button and handle the tap for each item but I need to reskin the button to make it look like a simple list item.

Finally, I don't understand why it is so complicated to achieve such a basic thing. Is there a simple and standard way I missed?

My second wish is to get an effect on the item when it is tapped. Is there any standard way to do it?

Fairyfairyland answered 8/1, 2013 at 12:43 Comment(3)
Thanks man for posting such good problem..:)Angieangil
good question ,also fitSecrecy
Also to get highlighting: code.msdn.microsoft.com/wpapps/…Passenger
N
41

You could null your LongListSelector's SelectedItem at the end of each SelectionChanged event. I.e.

<phone:LongListSelector x:Name="LLS" SelectionChanged="LLS_SelectionChanged">

And the event handler:

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;
}

You'll fire the SelectionChanged event twice, but nothing's going to happen the second time round and you should get the behaviour that you're looking for - (i.e Setting SelectedItem to null will trigger a new SelectionChanged event, but this second event gets caught in the if-statement)

As for the second part of your question, you might be better posting a new question.

Neddie answered 9/1, 2013 at 10:30 Comment(3)
Yes, that's what I finaly did. But it seams like a hack for a very usual taks. Don't you think ?Fairyfairyland
@Neddie My longlistselector is not firing selectionChanged event either in the viewmodel or code-behind .My long list list selector is in a pivot control and it has a data template . whats the reasonGibbosity
@Gibbosity - Without seeing the code it would be impossible to say; I suggest posting a question if you haven't done so already :)Neddie
S
9

I done it with the Tap event handling.

I prefer not to use Selected property, but get tapped item this way (and I haven't noticed any bugs):

MyListItemClass item = ((FrameworkElement)e.OriginalSource).DataContext 
                                                             as MyListItemClass;

Also, you could get the original item ContentPresenter simple by navigating up through VisualTree from e.OriginalSource. That way:

ContentPresenter itemPresenter = SomeHelperClass
                              .FindParent<ContentPresenter>(e.OriginalSource,"");

Where FindParent is similar to find child in this question: How can I find WPF controls by name or type?

ContentPresenter is that object what you need to manually change the item template if you want to (to set "selected" state for example).

Striking answered 13/1, 2013 at 22:21 Comment(0)
C
1
 private void Item_tap(object sender, RoutedEventArgs e)
        {
            var element = (FrameworkElement)sender;
            DataSource data = (DataSource)element.DataContext;


        }
Callaway answered 13/11, 2013 at 10:50 Comment(0)
G
0

My second wish is to get an effect on the item when it is tapped. Is there any standard way to do it?

For this the only thing you need to do add this to your control (or stackpanel where you want to have this effect):

<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
Gluconeogenesis answered 29/4, 2014 at 12:3 Comment(0)
T
0

first add this to *.xaml page inside the

LongListSelectorSelectionChanged="listBox_SelectionChanged"

so that it looks like this :

<toolkit:LongListSelector x:Name="listBox" SelectionChanged="listBox_SelectionChanged">

then in the *.xaml.cs file in the event handler

private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Write your logic on what you want to do with the selected item
}
Tori answered 28/10, 2014 at 10:4 Comment(0)
H
0

In addition to halil´s answer:

First of all you need to install the Windows Phone Toolkit (WPtoolkit) by NuGet. Than add the namespace declaration on the PhoneApplicationPage.

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

After this you can add toolkit:TiltEffect.IsTiltEnabled="True" to the control definition.

It is nice documneted by NOKIA: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone

Oliver

Hedley answered 18/11, 2014 at 7:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.