2013-01-08 12 views
36

Sto utilizzando il controllo LongListSelector su Windows Phone 8 e non riesco a trovare il modo migliore per gestire un tocco su un elemento. I pochi esempi che ho trovato si basano sull'evento SelectionChanged. Tuttavia, questa soluzione è bacata perché se tocco un elemento che apre una nuova pagina, premete e poi toccate di nuovo lo stesso oggetto, non funzionerà perché questo elemento è già selezionato, quindi SelectionChanged non viene attivato.LongListSelector: toccare l'elemento?

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'elemento quando viene toccato. C'è un modo standard per farlo?

+1

Grazie uomo per la pubblicazione di tale buon problema .. :) – Mohit

+0

buona domanda, anche in forma – IloveIniesta

+0

anche per ottenere mettendo in evidenza: http: // codice. msdn.microsoft.com/wpapps/Highlight-a-selected-item-30ced444 – brendan

risposta

41

È possibile null di longListSelector SelectedItem alla fine di ogni evento SelectionChanged. Cioè

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

E il gestore di eventi:

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

Potrai generare l'evento SelectionChanged due volte, ma niente succederà la seconda volta e si dovrebbe ottenere il comportamento che stai cercando - (vale a dire Impostazione SelectedItem a null sarà innescare un nuovo SelectionChanged evento, ma questo secondo evento viene catturato nel se-economico)

per quanto riguarda la seconda parte della tua domanda, si potrebbe essere migliore registrando un nuova domanda

+3

Sì, è quello che ho fatto. Ma sembra un trucco per un tak molto comune. Non pensi? –

+0

Grazie amico per la risposta ... :) – Mohit

+0

bella soluzione, lavoro nel mio progetto – IloveIniesta

9

L'ho fatto con il Gestione evento.

preferisco non usare proprietà Selected, ma ottenere elemento toccato in questo modo (e non ho notato qualche bug):

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

Inoltre, si potrebbe ottenere l'oggetto originale ContentPresenter semplice navigando attraverso VisualTree da e.OriginalSource. Stato How can I find WPF controls by name or type?

ContentPresenter è che oggetto ciò che è necessario modificare manualmente il modello di elemento se si desidera (per impostare "selezionato": in questo modo:

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

Dove FindParent è simile a trovare bambino in questa domanda per esempio).

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


     } 
0

Il mio secondo desiderio è quello di ottenere un effetto sulla voce quando viene toccato. esiste un modo standard per farlo?

Per questo l'unica cosa che devi fare aggiungere questo al vostro controllo (o StackPanel in cui si desidera avere questo effetto):

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

prima aggiungere questo a * XAML pagina all'interno del

LongListSelectorSelectionChanged="listBox_SelectionChanged" 

in modo che assomiglia a questo:

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

poi nel file * .xaml.cs nel gestore di eventi

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

Oltre a halil's risposta:

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

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

Dopo questo è possibile aggiungere toolkit:TiltEffect.IsTiltEnabled="True" alla definizione di controllo.

è bello documneted da Nokia: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone

Oliver