У меня есть приложение форм 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