Я получаю действительно странное поведение с помощью жеста смахивания в .NET MAUI. Направления вверх и вниз, похоже, не работают, а направления вправо и влево работают нормально. Кто-нибудь знает, что я делаю неправильно?
Вот простой пример:
<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "SwipeTester.MainPage">
<VerticalStackLayout Spacing = "25" Padding = "30,0" VerticalOptions = "Center">
<Label x:Name = "SwipedCounter" FontSize = "18" HorizontalOptions = "Center"
BackgroundColor = "Yellow" HeightRequest = "100" WidthRequest = "100"
HorizontalTextAlignment = "Center" VerticalTextAlignment = "Center"/>
<Label HeightRequest = "200"
WidthRequest = "100"
BackgroundColor = "Red">
<Label.GestureRecognizers>
<SwipeGestureRecognizer
Direction = "Down"
Swiped = "SwipeGestureRecognizer_OnSwiped"
Threshold = "20"/>
<SwipeGestureRecognizer
Direction = "Up"
Swiped = "SwipeGestureRecognizer_OnSwiped"
Threshold = "20"/>
<SwipeGestureRecognizer
Direction = "Left"
Swiped = "SwipeGestureRecognizer_OnSwiped"
Threshold = "20"/>
<SwipeGestureRecognizer
Direction = "Right"
Swiped = "SwipeGestureRecognizer_OnSwiped"
Threshold = "20"/>
</Label.GestureRecognizers>
</Label>
</VerticalStackLayout>
</ContentPage>
public partial class MainPage : ContentPage
{
int count = 0;
public MainPage()
{
InitializeComponent();
}
private void SwipeGestureRecognizer_OnSwiped(object sender, SwipedEventArgs e)
{
count++;
SwipedCounter.Text = count.ToString();
}
}
Для свойства SwipeGestureRecognizer.Direction
можно установить одно значение из перечисления SwipeDirection
или несколько значений.
Пролистывание по горизонтальной оси можно распознать, установив для свойства Direction значение Left
и Right
. Точно так же свайпы, происходящие по вертикальной оси, можно распознать, установив для свойства Direction значение Up
и Down
.
Вы можете обратиться к приведенному ниже примеру кода:
<VerticalStackLayout Spacing = "25" Padding = "30,0" VerticalOptions = "Center">
<Label x:Name = "SwipedCounter" FontSize = "18" HorizontalOptions = "Center"
BackgroundColor = "Yellow" HeightRequest = "100" WidthRequest = "100"
HorizontalTextAlignment = "Center" VerticalTextAlignment = "Center"/>
<Label HeightRequest = "200"
WidthRequest = "200"
BackgroundColor = "Red">
<Label.GestureRecognizers>
<SwipeGestureRecognizer
Direction = "Down"
Swiped = "OnSwiped"
Threshold = "50"
/>
<SwipeGestureRecognizer
Direction = "Up"
Swiped = "OnSwiped"
Threshold = "50"
/>
<SwipeGestureRecognizer
Direction = "Left"
Swiped = "OnSwiped"
Threshold = "50"
/>
<SwipeGestureRecognizer
Direction = "Right"
Swiped = "OnSwiped"
Threshold = "50"
/>
</Label.GestureRecognizers>
</Label>
</VerticalStackLayout>
void OnSwiped(object sender, SwipedEventArgs e)
{
switch (e.Direction)
{
case SwipeDirection.Left:
SwipedCounter.Text = "left";
break;
case SwipeDirection.Right:
SwipedCounter.Text = "right";
break;
case SwipeDirection.Up:
SwipedCounter.Text = "up";
break;
case SwipeDirection.Down:
SwipedCounter.Text = "down";
break;
}
}
Привет, Александр, большое спасибо за твой ответ. Мой код теперь работает для свайпов вверх и вниз. Но немного любопытно, что я действительно пробовал свой код несколько раз, и он не работал для Up и Down. Затем я попробовал «обычные подозреваемые»: обновление VS, очистку и пересборку проекта, удаление эмулятора и добавление нового, но свайпы вверх и вниз по-прежнему не работали. Затем я отправил свой вопрос, получил ваш ответ, попробовал, и это сработало ... не только для вашего порога в 50, но и для моего исходного порога в 20 или даже 5. И я действительно не трогал проект в среднем время... как-то странно.
Когда я тестировал ваш код, он хорошо работает в направлениях вверх и вниз. Возможно, вам придется установить Threshold = "50", чтобы это сработало.