web-dev-qa-db-fra.com

LongListSelector: élément tap?

J'utilise le contrôle LongListSelector sur Windows Phone 8 et je ne peux pas trouver le meilleur moyen de gérer un tap sur un élément .. Les quelques exemples que j'ai trouvés reposent sur l'événement SelectionChanged. Cependant, cette solution pose problème car si je tape sur un élément qui ouvre une nouvelle page, puis de nouveau sur le même élément, cela ne fonctionnera pas car cet élément est déjà sélectionné, donc SelectionChanged n'est pas déclenché.

J'ai essayé de m'inscrire à l'événement tap et d'utiliser l'élément actuellement sélectionné comme élément sélectionné, mais parfois, l'élément sélectionné n'est pas celui que j'attends.

Je pourrais envelopper mon ItemTemplate dans un bouton et gérer le tapotement pour chaque élément, mais je dois redéfinir le bouton pour le faire ressembler à un simple élément de liste.

Enfin, je ne comprends pas pourquoi il est si compliqué d’atteindre un objectif aussi fondamental. Y at-il un moyen simple et standard que j'ai raté?

Mon deuxième souhait est d'obtenir un effet sur l'élément lorsqu'il est exploité. Existe-t-il un moyen standard de le faire?

36
Tom Esterez

Vous pouvez null votre SelectedItem de LongListSelector à la fin de chaque événement SelectionChanged. C'est à dire.

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

Et le gestionnaire d'événement:

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

Vous déclencherez l'événement SelectionChanged deux fois, mais rien ne se passera au deuxième tour et vous devriez avoir le comportement que vous recherchez - (c'est-à-dire que définir SelectedItem sur null déclenchera un nouvel événement SelectionChanged, mais ce second événement sera intercepté. dans la déclaration if)

En ce qui concerne la deuxième partie de votre question, vous feriez mieux de poster une nouvelle question.

41
Stevie

Je l'ai fait avec le traitement de l'événement Tap.

Je préfère ne pas utiliser la propriété Selected, mais obtenir un élément exploité de cette façon (et je n'ai pas remarqué de bugs):

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

En outre, vous pouvez obtenir l'élément d'origine ContentPresenter simple en naviguant dans VisualTree à partir de e.OriginalSource. De cette façon:

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

Où FindParent est similaire à trouver enfant dans cette question: Comment puis-je trouver des contrôles WPF par nom ou par type?

ContentPresenter est cet objet dont vous avez besoin pour modifier manuellement le modèle d'élément si vous le souhaitez (pour définir l'état "sélectionné" par exemple). 

9
gleb.kudr
 private void Item_tap(object sender, RoutedEventArgs e)
        {
            var element = (FrameworkElement)sender;
            DataSource data = (DataSource)element.DataContext;


        }
1
Poojan Dave

Mon deuxième souhait est d'obtenir un effet sur l'élément lorsqu'il est exploité. Est Y at-il un moyen standard de le faire?

Pour cela, la seule chose que vous devez faire ajoute ceci à votre contrôle (ou stackpanel où vous voulez avoir cet effet):

<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
0
halil

En plus de la réponse de halil:

Tout d’abord, vous devez installer Windows Phone Toolkit (WPtoolkit) de NuGet. Ensuite, ajoutez la déclaration d'espace de noms sur la page PhoneApplicationPage.

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

Après cela, vous pouvez ajouter toolkit:TiltEffect.IsTiltEnabled="True" à la définition du contrôle.

Il est bien documenté par NOKIA: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone

Oliver

0
Oliver

ajoutez d'abord ceci à la page * .xaml à l'intérieur du 

LongListSelectorSelectionChanged="listBox_SelectionChanged"

de sorte qu'il ressemble à ceci:

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

puis dans le fichier * .xaml.cs dans le gestionnaire d'événements 

private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Write your logic on what you want to do with the selected item
}
0
AVIK DUTTA