首页 > 解决方案 > 在 Xamarin Forms 中单击后如何暂时禁用按钮?

问题描述

我正在制作一个投票应用程序Xamarin Forms,我希望用户每天只能投票一次。在 UI 页面上,我创建了一个 ImageButton,我希望用户能够每天点击一次。我尝试使用计时器,并尝试以 5 秒的间隔对其进行测试。应用程序在我第一次单击它时禁用了该按钮,但 5 秒后我可以再次单击它并且它不会禁用该按钮。

private void ImageButton_Clicked(object sender, EventArgs e)
{
   this.IsEnabled = false;
   Timer aTimer = new Timer();
   aTimer.Interval = 5000; //ms
   aTimer.Enabled = true;
   aTimer.Elapsed += ATimer_Elapsed;
}

private void ATimer_Elapsed(object sender, ElapsedEventArgs e)
{
  this.IsEnabled = true;       
}

我看到应用程序ImageButton_Clicked一直进入函数但它没有执行this.IsEnabled=false

标签: c#.netxamarin.forms

解决方案


实际上,该应用程序正在执行您告诉它的操作。

this.IsEnabled正在工作,但这引用页面本身。如果要单击以禁用已触发事件的按钮,则需要:

private void ImageButton_Clicked(object sender, EventArgs e)
{
    if (sender is Button button)
    {
        button.IsEnabled = false;
        // the rest of the logic
    }
}

在这里,我们将其转换sender为 Xamarin.Forms。按钮。如果转换成功,这意味着如果发送者是我们的按钮,那么我们可以禁用它。

如果您不想强制转换它或者您想在其他方法中使用按钮引用(就像您再次启用它一样),只需Name在 xml 中使用属性设置按钮,如下所示:

<Button 
    x:Name="myButton"
    Clicked="ImageButton_Clicked" />

然后,您可以在ATimer_Elapsed方法的代码隐藏中使用它,如下所示:

private void ATimer_Elapsed(object sender, ElapsedEventArgs e)
{
    Device.BeginInvokeOnMainThread(() => { myButton.IsEnabled = true; });
}

编辑:在主/UI线程上调用here非常重要,因为计时器逻辑是在后台线程上完成的。IsEnabled = true


推荐阅读