Событие FlipView SelectionChanged возникает только после завершения сенсорных манипуляций

Из документов:

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

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


person Derek Beattie    schedule 10.12.2014    source источник


Ответы (1)


Одним из решений проблемы является расширение 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 другим способом, не зависящим от его имени. Например, используя метод в моем ответе здесь. Хотя, думаю, это тоже нормально.

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

person yasen    schedule 17.12.2014
comment
Я не понимал, что это так просто. Я протестировал его, и с некоторыми изменениями он будет работать. Спасибо. - person Derek Beattie; 18.12.2014
comment
Хороший ответ! Но я думаю, что обычно получают дочерний элемент шаблона (ScrollViewer) по имени внутри пользовательского элемента управления OnApplyTemplate. - person Justin XL; 23.12.2014
comment
@DerekBeattie: Не могли бы вы добавить сюда свои настройки? - person Jakub Krampl; 27.12.2014
comment
@DerekBeattie: кстати: ты знаешь, что навигация с помощью кнопок «предыдущий/следующий» не работает? - person Jakub Krampl; 09.01.2015
comment
@kubakista да, в моем случае предыдущее/следующее происходит с помощью элементов управления SMT. В итоге я позволил пользователю прокручивать страницу так быстро, как он хочет, в результате чего задачи были отменены. - person Derek Beattie; 09.01.2015