Прокрутка при перетаскивании мышью в приложении xamarin forms uwp - PullRequest
0 голосов
/ 30 января 2020

У меня есть приложение форм xamarin с несколькими видами прокрутки, которые прокручиваются горизонтально внутри прокрутки, которая прокручивается по вертикали. Примерно так.

<ScrollView Orientation="Vertical">
  <ScrollView Orientation="Horizontal">
    <StackLayout Orientation="Horizontal">
      <!-- lots of images here -->
    </StackLayout>
  </ScrollView Orientation="Horizontal">
  <ScrollView Orientation="Horizontal">
    <StackLayout Orientation="Horizontal">
      <!-- lots of images here -->
    </StackLayout>
  </ScrollView Orientation="Horizontal">
</ScrollView>

Я хочу, чтобы мои пользователи могли перемещаться влево / вправо и вверх / вниз для навигации по экрану - панорамирование X активирует прокрутку горизонтальной прокрутки под пальцем - панорамирование Y активирует прокрутка вертикальной прокрутки

В andoid это прекрасно работает с сенсорным вводом, перетаскивающим горизонтальное и вертикальное направления (не одновременно, но достаточно близко). Но в UWP при использовании мыши пользователь должен использовать полосы прокрутки. Это не так хорошо работает. С другой стороны, если вы используете трекпад и прокрутку двумя пальцами, это работает нормально. Я хочу посмотреть, смогу ли я программировать такое же поведение при перетаскивании мышью.

Я использую программное обеспечение MR.Gestures для привязки к «событию панорамирования»

Существует 2 метода что выглядит многообещающе,

  • ScrollView.ScrollToAsyn c
  • ScrollView.SetScrolledPosition

Я попробовал следующий код

MyMrScrollView.cs

    public class MyMrScrollView : MR.Gestures.ScrollView
    {
        protected override void OnPropertyChanged(string propertyName = null)
        {
            Debug.WriteLine(propertyName);
            if (!ManipulatingScrolling)
            {
                base.OnPropertyChanged(propertyName);
            }
        }

        public bool ManipulatingScrolling { get; set; }
    }

обработчик событий для кода позади представления

        private async void ScrollView_OnPanning(object sender, PanEventArgs e)
        {
            var scrollView = sender as MyMrScrollView;
            Debug.WriteLine("x:" + scrollView.ScrollX + " + " + e.DeltaDistance.X);
            scrollView.ManipulatingScrolling = true;
            await scrollView.ScrollToAsync(scrollView.ScrollX + e.DeltaDistance.X, scrollView.ScrollY, false);
            scrollView.ManipulatingScrolling = false;
            Debug.WriteLine("x:" + scrollView.ScrollX);
            //scrollView.SetScrolledPosition(scrollView.ScrollX+e.DeltaDistance.X,scrollView.ScrollY);
        }

И это вроде работает, но я получаю очень неприятный результат, совсем не то, к чему я стремлюсь (не сравнимо с поведением перетаскивания в android)

Второй метод помечен как «Для внутреннего использования», пробовал тоже, но не повезло.

Проблема в asyn c части scrolltoasyn c? потому что когда я смотрю на свойство ScrollX после вызова ScrollToAsyn c, значение не равно PreviousValue + delta

...