Есть ли способ заставить команды GestureRecognizer работать в кнопке Xamarin Forms? - PullRequest
0 голосов
/ 02 марта 2020

Я хочу получить события Swipe и Tap, работающие на кнопке в Xamarin Forms, используя шаблон Command.

Однако я не получаю первый забор, так как, если я помещаю команду Tap внутри a GestureRecognizer (ButtonA ниже), тогда событие не регистрируется.

Если я помещаю Команду непосредственно внутри кнопки (ButtonB ниже), тогда она регистрируется.

Другие сообщали о проблемах с GestureRecognizers в кнопках, поэтому я попытался встроить GestureRecognizer в StackLayout, но он также не регистрируется.

        <Button x:Name="buttonA" Grid.Row="1" Text="Button A" BackgroundColor="LightGreen" >
            <Button.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding OnCommand}" CommandParameter="Button" />
                <ClickGestureRecognizer Command="{Binding OnCommand}" CommandParameter="Button" />
            </Button.GestureRecognizers>
        </Button>
        <Button x:Name="buttonB" Grid.Row="2" Text="Button B" BackgroundColor="LightBlue"
                Command="{Binding OnCommand}" CommandParameter="Button" >
        </Button>
        <StackLayout Grid.Row="3" >
            <StackLayout.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding OnCommand}" CommandParameter="Button" />
            </StackLayout.GestureRecognizers>
            <Button x:Name="buttonC" Text="Button C" BackgroundColor="Orange" />
        </StackLayout>

1 Ответ

0 голосов
/ 02 марта 2020

Комментарий Лукаса поставил меня на правильный путь. Вот краткое описание поведения, как я его понимаю:

(*) Помещение GestureRecognizer любого типа - включая ClickGestureRecognizer - в конфликты кнопок и не будет работать (кнопка A ниже)

() Помещение Команда непосредственно в кнопке работает (кнопка B ниже)

() Помещение GestureRecognizer в элемент, такой как Grid или StackLayout, который содержит , кнопка конфликтует и не будет работать (LayoutA + button C ниже)

() Удаление кнопки из сетки или StackLayout решает проблему (LayoutB ниже)

        <Button x:Name="buttonA" Grid.Row="1" Text="Button A" BackgroundColor="LightGreen" >
            <Button.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding TapCommand}" CommandParameter="Button" />
                <ClickGestureRecognizer Command="{Binding TapCommand}" CommandParameter="Button" />
            </Button.GestureRecognizers>
        </Button>
        <Button x:Name="buttonB" Grid.Row="2" Text="Button B" BackgroundColor="LightBlue"
                Command="{Binding TapCommand}" CommandParameter="Button" >
        </Button>
        <StackLayout x:Name="LayoutA" Grid.Row="3" >
            <StackLayout.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding TapCommand}" CommandParameter="Button" />
            </StackLayout.GestureRecognizers>
            <Button x:Name="buttonC" Text="Button C" BackgroundColor="Orange" />
        </StackLayout>
        <StackLayout x:Name="LayoutB" Grid.Row="4" BackgroundColor="White" >
            <StackLayout.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding TapCommand}" CommandParameter="Button" />
                <SwipeGestureRecognizer Direction="Left" Command="{Binding SwipeCommand}" CommandParameter="leftSwipe" />
            </StackLayout.GestureRecognizers>
        </StackLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...