连续按钮单击传递到下一个按钮,如何防止

时间:2019-05-10 13:24:50

标签: xamarin.forms xamarin.mac

我的项目在Xamarin.Forms中,支持的平台是iOS,android和Mac。我在单个Xamrin.Forms.View中有两个Stacklayout,每个Stacklayout在同一位置上都有一个按钮。这意味着在第一个Stacklayout中,按钮1的位置为x = 100,y = 100,在第二个Stacklayout中的按钮2位置与第一个Stacklayout相同。默认情况下,第一个为Stacklayout Visible,第二个为Hide,现在,当我单击按钮1时,在API响应到达后,第一个Stacklayout隐藏并显示第二个布局。

当用户单击按钮1时,我立即将文本更改为“请稍候”,此处按钮的文本颜色设置为“白色”,以便在黑暗的按钮背景中更好地查看。让我们考虑一下API需要花费10秒钟的时间来进行处理,在此期间,如果用户在按钮上单击按钮1多次,则在Mac平台上,Mac将在某个位置存储/保存这些单击的事件;当10秒后第二个Stacklayout可见时,则mac立即触发即使用户未单击按钮2,也存储/保留了按钮2的单击事件。如何防止它发生?

我试图在用户单击按钮后将按钮1设置为IsEnabled = false,在上述情况下它可以正常工作,但是当我将按钮设置为禁用时,在这种情况下,按钮文本颜色在Mac平台上会自动从白色变为黑色。我不想更改文本的颜色。如果有人可以在禁用模式下更改文本颜色的解决方案,那么它对我有用,或者如果有其他解决方案可以防止多次单击,请告诉我。

1 个答案:

答案 0 :(得分:0)

所以,这就是我要解决的问题:

我会在视图中添加一个标签,所以我们有 button1 标签 button2 :彼此之上。

开始时,您可以看到 button1 ,而另两个则不可见。

点击button1时,它被隐藏:button1.IsVisible = false。立即将标签设置为可见,然后,您可以坐下来等待操作完成( 在按钮的事件处理程序中await进行操作至关重要!! ),然后在完成工作后,将 label 可见性设置为false,并将 button2 设置为可见。

您可以按照相同的逻辑再次返回。

最终结果是,当您点击 button1 时,会显示 label ,因此,如果用户继续点击,这些拍子不会被存储。保留!


Xamarin.Forms 的代码将完全按照以下步骤进行操作。

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;

        }
    }
} 

我希望您觉得这很有用:)