如何单击按钮背景颜色更改?

时间:2018-04-04 12:39:45

标签: c# xamarin.forms

我已经阅读了很多关于此问题的帖子,但我似乎无法让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()之前,如何进行两种颜色更改,然后再各自延迟?

1 个答案:

答案 0 :(得分:0)

您必须先使用asyncawait等待(换色)任务完成,然后再继续执行您之后要执行的任务。

您的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();
        };              
    }
}