Непрерывное нажатие кнопки передается следующей кнопке, как предотвратить - PullRequest
0 голосов
/ 10 мая 2019

Мой проект в Xamarin.Forms, поддерживаемая платформа iOS, android и Mac. У меня есть два Stacklayout в одном Xamrin.Forms.View, и каждый Stacklayout имеет одну кнопку в той же позиции. Это означает, что позиция кнопки 1 равна x = 100, а y = 100 в первой разметке стека, а позиция кнопки 2 во второй разметке стека совпадает с первой разметкой стека. По умолчанию первый Stacklayout Visible, а второй - hide, теперь, когда я нажал кнопку 1, затем первый Stacklayout hide и видимый второй макет после получения ответа API.

Когда пользователь нажимает кнопку 1, я немедленно изменяю текст на «Пожалуйста, подождите», и здесь цвет текста кнопки устанавливается на Белый для лучшего просмотра на темном фоне кнопки. Давайте предположим, что API занимает 10 секунд для выполнения процесса. В промежутке между тем, если пользователь нажимает несколько раз на кнопку 1, а затем на платформе Mac, Mac будет сохранять / сохранять те события, на которые нажали, где-то, и когда второй Stacklayout Visible станет видимым через 10 секунд, то Mac сразу же запустит те сохраненные / сохраненные события нажатия кнопки 2, даже если пользователь не нажал кнопку 2. Как я могу предотвратить это?

Я попытался установить IsEnabled = false для кнопки 1 после того, как пользователь нажал на нее, в вышеописанном сценарии она работает нормально, но когда я делаю кнопку отключенной, в этом случае цвет текста кнопки автоматически меняется с белого на черный на платформе Mac. Я не хочу менять цвет текста. Если у кого-то есть решение изменить цвет текста в отключенном режиме, то это работает для меня, ИЛИ если какое-либо другое решение для предотвращения многократного щелчка, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 11 мая 2019

Итак, вот как я бы обошёл эту проблему:

Я бы добавил метку к представлению, поэтому у нас есть button1 , метка , button2 : одна над другой.

При запуске вы видите button1 видимым, а два других невидимыми.

Когда кнопка 1 нажата, она скрыта: button1.IsVisible = false. Немедленно метка становится видимой, а затем вы можете сидеть и ждать, пока операция не завершится ( очень важно, чтобы вы await поместили ее в обработчик событий кнопки !! ), и когда работа завершена, вы устанавливаете label visibility в false и button2 как видимые.

И вы можете вернуться снова, следуя той же логике.

Окончательный результат заключается в том, что при нажатии button1 вместо этого появляется метка , поэтому, если пользователь продолжает нажимать, эти касания не сохраняются / сохраняются !


Код для Xamarin.Forms , который будет работать именно так, как показано ниже.

1046 * XAML * <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MyApp.Page1"> <ContentPage.Content> <Grid HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Button x:Name="button1" Text="Go to the Moon!" Clicked="Button_Clicked"/> <Label x:Name="label" IsVisible="False"/> <Button x:Name="button2" Text="Go back home!" IsVisible="False" Clicked="Button_Clicked_1"/> </Grid> </ContentPage.Content> </ContentPage> Код позади

using System;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace MyApp
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Page1 : ContentPage
    {
        public Page1 ()
        {
            InitializeComponent ();
        }

        String text1 = "Going to the moon...";

        String text2 = "Going back home...";


        private async void Button_Clicked(object sender, EventArgs e)
        {

            ((Button)sender).IsVisible = false;

            label.Text = text1;
            label.IsVisible = true;

            // Simulates running process!
            await Task.Delay(3000);

            label.IsVisible = false;
            button2.IsVisible = true;

        }

        private async void Button_Clicked_1(object sender, EventArgs e)
        {
            ((Button)sender).IsVisible = false;

            label.Text = text2;
            label.IsVisible = true;

            // Simulates running process!
            await Task.Delay(3000);

            label.IsVisible = false;
            button1.IsVisible = true;

        }
    }
} 

Надеюсь, вы найдете это полезным:)

...