c# - 在 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
;
解决方案
实际上,该应用程序正在执行您告诉它的操作。
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
推荐阅读
- fullcalendar - 来自未显示在 FullCalendar 4 中的实际日历中的数组的事件
- javascript - 如何将 onclick 参数视为变量而不是 Javascript 中的字符串?
- c++ - 我如何在封闭类中调用封闭类对象的构造函数
- windows - AWS CodeDeploy 未能部署到 Windows 10 本地计算机
- regex - 打印不是数字的行
- c# - 带有 DBQuery 的 Entity Framework Core 2 - 获取未设置为对象实例的对象引用
- xcode - 如何在 xcode 11.2 中链接 ftdi d2xx dylib?
- angular - 在更新新数据标记之前删除标记
- influxdb - 涌入数据库 | 获取最后一点和第一点之间的经过时间
- google-cloud-platform - 当使用相同的子网 IP 创建两个 GCP VPN 时,会导致故障排除