LongListSelector: toccare l’elemento?

Sto usando il controllo LongListSelector su Windows Phone 8 e non riesco a capire il modo migliore per gestire un touch su un object. I pochi esempi che ho trovato si basano sull’evento SelectionChanged. Tuttavia, questa soluzione è bacata perché se touch un elemento che apre una nuova pagina, premete e poi toccate di nuovo lo stesso object, non funzionerà perché questo elemento è già selezionato, quindi SelectionChanged non viene triggersto.

Ho provato a registrarmi all’evento tap e utilizzare l’elemento selezionato corrente come quello toccato, ma alcune volte l’elemento selezionato non è quello che mi aspetto.

Potrei avvolgere il mio ItemTemplate in un pulsante e gestire il rubinetto per ogni elemento, ma ho bisogno di reskin il pulsante per farlo sembrare un semplice elemento di elenco.

Infine, non capisco perché sia ​​così complicato ottenere una cosa così basilare. C’è un modo semplice e standard che mi è sfuggito?

Il mio secondo desiderio è quello di ottenere un effetto sull’object quando viene toccato. C’è un modo standard per farlo?

Potresti annullare l’object SelectedItem di LongListSelector alla fine di ogni evento SelectionChanged . ie

  

E il gestore dell’evento:

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

Sparerai l’evento SelectionChanged due volte, ma non succederà nulla alla seconda volta e dovresti ottenere il comportamento che stai cercando – (Ad esempio, l’impostazione di SelectedItem su null attiverà un nuovo evento SelectionChanged , ma questo secondo evento verrà catturato nell’istruzione if)

Per quanto riguarda la seconda parte della tua domanda, potresti pubblicare una nuova domanda.

L’ho fatto con la gestione degli eventi Tap .

Preferisco non usare la proprietà Selected, ma ottenere object toccato in questo modo (e non ho notato alcun bug):

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

Inoltre, è ansible ottenere l’object originale ContentPresenter semplice navigando attraverso VisualTree da e.OriginalSource. Quel modo:

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

Dove FindParent è simile a trovare child in questa domanda: Come posso trovare i controlli WPF per nome o tipo?

ContentPresenter è quell’object che è necessario modificare manualmente il modello dell’elemento se si desidera (per impostare lo stato “selezionato”, ad esempio).

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

Il mio secondo desiderio è quello di ottenere un effetto sull’object quando viene toccato. C’è un modo standard per farlo?

Per questo l’unica cosa che devi fare è aggiungere questo al tuo controllo (o stackpanel dove vuoi avere questo effetto):

  

per prima cosa aggiungilo alla pagina * .xaml all’interno di

 LongListSelectorSelectionChanged="listBox_SelectionChanged" 

in modo che assomigli a questo:

  

quindi nel file * .xaml.cs nel gestore eventi

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

Oltre alla risposta di halil:

Prima di tutto è necessario installare Windows Phone Toolkit (WPtoolkit) di NuGet. Aggiungere la dichiarazione dello spazio dei nomi in PhoneApplicationPage.

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

Successivamente è ansible aggiungere toolkit:TiltEffect.IsTiltEnabled="True" alla definizione del controllo.

È bello documentato da NOKIA: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone

Oliver