我已经阅读了很多关于此问题的帖子,但我似乎无法让XamarinForms做我想做的事情。我想要一个按钮,在单击时短暂更改其背景颜色,然后在处理特定的单击功能之前再将其更改回来。比如,蓝色按钮变为红色200毫秒,然后变回蓝色,然后发生实际的事件处理。 我创建了一个BaseButton类,它在点击响应中进行颜色更改:
public class BaseButton : Button
{
public BaseButton()
{
Clicked += (sender,e) =>
{
BackgroundColor = BaseColors.ButtonPressedBackgroundColor;
TextColor = BaseColors.ButtonPressedTextColor;
BorderColor = BaseColors.ButtonPressedBorderColor;
this.ScaleTo(1,200);
BackgroundColor = BaseColors.ButtonBackgroundColor;
TextColor = BaseColors.ButtonTextColor;
BorderColor = BaseColors.ButtonBorderColor;
this.ScaleTo(1,200);
};
}
}
只要没有处理工作,这就很有效。 但是,当我制作BaseButton MyButton并说MyButton.Clicked + = DoSomething,并且有:
private void DoSomething(object sender, EventArgs e)
{
ProcessTheClick();
}
当我单击MyButton时,总延迟为400毫秒,之后两个颜色都发生了没有延迟的变化,并且ProcessTheClick()会立即执行。
好像颜色变化必须等待控件释放回UI。
在执行ProcessTheClick()之前,如何进行两种颜色更改,然后再各自延迟?
答案 0 :(得分:0)
您必须先使用async
和await
等待(换色)任务完成,然后再继续执行您之后要执行的任务。
您的BaseButton
课程应为:
public class BaseButton : Button
{
public BaseButton()
{
Clicked += async (sender,e) =>
{
BackgroundColor = BaseColors.ButtonPressedBackgroundColor;
TextColor = BaseColors.ButtonPressedTextColor;
BorderColor = BaseColors.ButtonPressedBorderColor;
await Task.Delay(200); // wait for 200ms
BackgroundColor = BaseColors.ButtonBackgroundColor;
TextColor = BaseColors.ButtonTextColor;
BorderColor = BaseColors.ButtonBorderColor;
await Task.Delay(200); // wait for 200ms
// process the click after the 400ms total waiting
ProcessTheClick();
};
}
}