我正在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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句