我的项目在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平台上会自动从白色变为黑色。我不想更改文本的颜色。如果有人可以在禁用模式下更改文本颜色的解决方案,那么它对我有用,或者如果有其他解决方案可以防止多次单击,请告诉我。
答案 0 :(得分:0)
所以,这就是我要解决的问题:
我会在视图中添加一个标签,所以我们有 button1 ,标签, button2 :彼此之上。
开始时,您可以看到 button1 ,而另两个则不可见。
点击button1时,它被隐藏:button1.IsVisible = false
。立即将标签设置为可见,然后,您可以坐下来等待操作完成( 在按钮的事件处理程序中await
进行操作至关重要!! ),然后在完成工作后,将 label 可见性设置为false,并将 button2 设置为可见。
您可以按照相同的逻辑再次返回。
最终结果是,当您点击 button1 时,会显示 label ,因此,如果用户继续点击,这些拍子不会被存储。保留!
Xamarin.Forms 的代码将完全按照以下步骤进行操作。
<?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;
}
}
}
我希望您觉得这很有用:)