Временная смена цвета

190
10 апреля 2019, 15:40

Нужно на 2 секунды изменить цвет Border на другой, но по истечению времени вернуть начальный цвет(чёрный). А какой цвет будет появляться, узнаем из bool

if (true){
    Brushes.Green;
}else {
    Bruses.Red;
}

Примерно вот так.

Вроде бы все сделал, но куда таймер пихать не пойму. Или задержку. Как сделать?

MathWorker.cs

private SolidColorBrush changeColorForSecond()
    {
        return Brushes.Green;
    }
    public async void CheckAnswer(int result, int answer)
    {
        if (result == answer)
        {
            RightAnswers++;
            SolidColorBrush resdult = await Task.Factory.StartNew(
                                         () => changeColorForSecond(),
                                         TaskCreationOptions.LongRunning);
            WorkWindow.border.BorderBrush = resdult;
        }
        else
        {
            WrongAnswers++;
        }
    }

WorkWindow.cs

int result = Convert.ToInt32(MathAnswer.Text);
                int answer = Convert.ToInt32(new DataTable().Compute(Expression_Math.Content.ToString(), null));
                mathWorker.CheckAnswer(result, answer);
Answer 1

Если надо просто сделать задержку и повторить действие, то так и пишите:

WorkWindow.border.BorderBrush = resdult; //Изначальная смена цвета 
await Task.Delay(1000); //Задержка
WorkWindow.border.BorderBrush = Bruses.Red; //Вторичная смена цвета

Но этот подход как по мне, не очень правильный, ибо вы обращаетесь к контроллу напрямую (когда лучше использовать привязки, я уже молчу про MVVM) и по сути эту задачу можно решить простым XAML кодом (ибо смена цвета, размера шрифта или каких то еще действий с UI - это задача View).

Напишу простой пример реализации более верного подхода:

<Border Background="Transparent">
    <Border.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsAnimated}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" To="GreenYellow" Duration="0:0:0" />
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" BeginTime="0:0:5" Duration="0:0:0" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

Здесь я создал некий Border с изначально прозрачным цветом. В стиле этого элемента я создал DataTriger, который привязан к некому Bool, если это свойство true, то наш триггер выполнит DataTrigger.EnterActions, а в нем и наша анимация.

Анимация:
По сути анимация из себя представляет временную шкалу, где каждый "тик" что то происходит. Вот мы и задаем две анимации, первая, сменит Background элемента на зеленый моментально (без задержек). Вторая анимация, благодаря BeginTime начнется с 5-ой секунды и у нее обратное действие (изменить цвет без задержки на изначальное).

Результат:

READ ALSO
Ошибка Windows Forms

Ошибка Windows Forms

В общем код должен проверять,что пользователь вводит 16<=число<0Но при вводе символа или если ввести символ и стереть его выводи ошибку...

155
Ошибка в коде, игра на android

Ошибка в коде, игра на android

Пишу игру на unity используя c# под androidСуть кода такова: Объект вращается с постоянной скоростью, но если сделать удерживающее касание (скрипт...

198
возврат Marshal LPArray из unmanaged dll

возврат Marshal LPArray из unmanaged dll

Как грамотно вернуть массив структур из C unmanaged кода воспользовавшись опцией LPArray? На текущий момент маршалю все в ручную, возвращая IntPtr, но хотелось...

184
Начальное значение Random() в C#

Начальное значение Random() в C#

Подскажите, пожалуйста, на что указывает и влияет начальное значение в объявлении нового объекта RandomДопустим 999, в нашем случае

159