2014-12-10 2 views
9

docs От:FlipView SelectionChanged событие происходит только тогда, когда сенсорные манипуляции полный

Примечание Когда пользователь щелкает по содержимому FlipView с помощью сенсорного взаимодействия, SelectionChanged событие происходит только тогда, когда сенсорные манипуляции завершены. Это означает, что когда пользователь быстро перебрасывает содержимое , отдельные события SelectionChanged не всегда генерируются для каждого элемента , потому что все еще происходит манипуляция.

Есть ли способ настроить управление FlipView для пожара SelectionChanged для каждого флип? Такое поведение делает интерес интересным для пейджинга, поскольку пользователь, если он достаточно быстро перевернулся, может перевернуть в конец списка, прежде чем добавить больше элементов.

ответ

10

Одним из решений проблемы является расширение FlipView и мониторинг его ScrollViewer. Вот краткий пример того, что я предлагаю. Кажется, нужно работать с горизонтальным флип-представлением (не обрабатывать какие-либо другие случаи и не испытывать слишком много).

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

Некоторые вещи, чтобы отметить:

  1. Вы можете получить ScrollViewer другим способом, который не зависит от его имени. Как и использование метода в моем ответе here. Хотя, я думаю, это тоже хорошо.

  2. Возможно, лучше использовать отдельное событие для этого. В приведенном выше коде я устанавливаю свойство SelectedIndex, которое вызывает событие SelectionChanged, но также очень вероятно, что он будет делать и другие вещи, поэтому в некоторых случаях это может быть проблемой.

+0

Я не осознавал, что это было прямолинейно. Я протестировал его, и с некоторыми настройками он будет работать. Благодарю. –

+0

Хороший ответ! Но я думаю, что обычным является получение шаблона child ('ScrollViewer') по имени внутри пользовательского элемента управления 'OnApplyTemplate'. –

+0

@DerekBeattie: Не могли бы вы добавить здесь свои «хитрости»? –

Смежные вопросы