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?
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.
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).
private void Item_tap(object sender, RoutedEventArgs e)
{
var element = (FrameworkElement)sender;
DataSource data = (DataSource)element.DataContext;
}
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">
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
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
}