2014-12-10 7 views
9

Dal docs:evento FlipView SelectionChanged si verifica solo quando tocco le manipolazioni sono completi

Nota Quando un utente sfoglia i contenuti FlipView utilizzando tocco interazione, un evento SelectionChanged si verifica solo quando tocco manipolazioni sono completi. Ciò significa che quando un utente sfoglia rapidamente il contenuto di , i singoli eventi di SelectionChanged non sono sempre generati per ogni articolo perché la manipolazione è ancora in corso.

C'è un modo per configurare il controllo FlipView al fuoco SelectionChanged per ogni lancio? Questo comportamento rende interessante l'impaginazione in quanto l'utente, se capovolge abbastanza velocemente, può passare alla fine della lista prima di aggiungere altri elementi.

risposta

10

Una soluzione al problema è estendere il FlipView e monitorare il suo ScrollViewer. Ecco un rapido esempio di ciò che sto suggerendo. Sembra funzionare sulla vista a flip orizzontale (non ho gestito nessun altro caso e non ho testato troppo).

public class FixedFlipView : FlipView { 
    public ScrollViewer ScrollViewer { 
     get; 
     private set; 
    } 

    protected override void OnApplyTemplate() { 
     base.OnApplyTemplate(); 

     this.ScrollViewer = (ScrollViewer)this.GetTemplateChild("ScrollingHost"); 
     this.ScrollViewer.ViewChanged += ScrollViewer_ViewChanged; 
    } 

    void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { 
     var index = (int)this.ScrollViewer.HorizontalOffset - 2; 
     if (this.SelectedIndex != index) { 
      this.SelectedIndex = index; 
     } 
    } 
} 

Alcune cose da notare:

  1. Si consiglia di ottenere lo ScrollViewer in modo diverso che non dipende sul suo nome. Come usare il metodo nella mia risposta here. Anche se, direi che va bene anche questo.

  2. Potrebbe essere un'idea migliore utilizzare un evento separato per questo. Nel codice sopra ho impostato la proprietà SelectedIndex, che solleva l'evento SelectionChanged, ma è anche molto probabile che stia facendo anche altre cose, quindi potrebbe essere un problema in alcuni casi.

+0

Non avevo capito che era così semplice. L'ho provato e con alcune modifiche funzionerà. Grazie. –

+0

Buona risposta! Ma penso che sia comune ottenere il template child (il 'ScrollViewer') per nome all'interno di' OnApplyTemplate 'di un controllo personalizzato. –

+0

@DerekBeattie: Potresti aggiungere le tue "modifiche" qui? –

Problemi correlati