Как использовать SolidColorBrush в ColorAnimation для свойства Background? - PullRequest
1 голос
/ 22 декабря 2019

Я немного сбит с толку следующим вопросом.

Я определил SolidColorBrush в XAML

<SolidColorBrush x:Key="BuildItemMouseOverBackground" Color="#617492"/>

Мой стиль:

<Style x:Key="BuildItem" TargetType="{x:Type Border}" BasedOn="{StaticResource RoundBorder}">
    <Setter Property="Background" Value="{StaticResource BuildItemBackground}" />
    <Style.Triggers>
        <EventTrigger RoutedEvent="Mouse.MouseEnter">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetProperty="Background" To="{StaticResource BuildItemMouseOverBackground}" Duration="0:0:0.5" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Style.Triggers>
</Style>

Ноэтот код выдает исключение:

ArgumentException: '#FF617492' is not a valid value for property 'To'.

Если я установлю To как Red или #123456, код работает нормально. Так что мой вывод To ожидает цвет, а не кисть. Но это действительно странно, потому что я посмотрел на Border класс и обнаружил, что Background на самом деле кисть.

Border Class

Я пытался изменить ColorAnimationтаким образом:

<ColorAnimation Storyboard.TargetProperty="Background" To="{Binding Source={StaticResource BuildItemMouseOverBackground}, Path=Color}" Duration="0:0:0.5" />

но похоже, что есть проблема с многопоточностью, и я получаю исключение

InvalidOperationException: Cannot freeze this Storyboard timeline tree for use across threads.

Так что мой вопрос: как правильно использовать SolidColorBrushв ColorAnimation?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2019

Поскольку свойство To является объектом Color, а BuildItemMouseOverBackground - SolidColorBrush.

Необходимо создать конвертер для преобразования типа SolidColorBrush в Color.

public class SolidColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(Color))
            throw new InvalidOperationException("The target must be a Color");

        return ((SolidColorBrush) value)?.Color ?? new Color();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

и используйте так:

<converters:SolidColorConverter x:Key="ToColor"/>

<ColorAnimation Storyboard.TargetProperty="Background" To="{Binding Source={StaticResource BuildItemMouseOverBackground,Converter={StaticResource ToColor}}, Path=Color}" Duration="0:0:0.5" />
0 голосов
/ 22 декабря 2019
<Setter Property="Background" Value="{StaticResource BuildItemBackground}" />

В приведенном выше коде свойство BackGround может получить тип SolidColorBrush. Поэтому, если тип BuildItemBackground имеет вид SolidColorBrush, как показано ниже, тогда он будет работать хорошо.

<SolidColorBrush x:Key="BuildItemBackground" Color="#3e3e42" />

Но код ниже не может получить тип SolidColorBrush.

<ColorAnimation Storyboard.TargetProperty="Background" To="{StaticResource BuildItemMouseOverBackground}" Duration="0:0:0.5" />

Следовательно, если вы объявилиТип SolidColorBrush, как показано ниже. Компилятор выдаст ошибку.

<SolidColorBrush x:Key="BuildItemMouseOverBackground" Color="#3e3e42" />

В коде, подобном Animation, вы должны использовать тип 'Color'. следовательно, если вы измените определение BuildItemMouseOverBackground на Color, как показано ниже, то оно будет работать хорошо.

<Color x:Key="BuildItemMouseOverBackground">#3e3e42</Color>

Аналогично, если вы используете свойство BackGround или BorderBrush для поддержки анимации, как показано ниже, вам придется использовать 'Color'тип вместо типа' SolidColorBrush '.

<Border.BorderBrush>
    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
        <LinearGradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="{DynamicResource BorderMediumColor}" Offset="0.0" />
                <GradientStop Color="{DynamicResource BorderDarkColor}" Offset="1.0" />
            </GradientStopCollection>
        </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
</Border.BorderBrush>

В приведенном выше коде BorderMediumColor и BorderDarkColor должны иметь тип' Color '. Если используется тип 'SolidColorBrush', компилятор выдаст ошибку.

Если вы используете свойство BackGroud или BorderBrush, как показано ниже. (Сейчас) Тип цвета должен быть 'SolidColorBrush'

<Setter Property="Background" Value="{StaticResource BuildItemBackground}" />

Поэтому, чтобы решить эту проблему, сначала измените тип BuildItemMouseOverBackground на Color, как показано ниже.

<Color x:Key="BuildItemMouseOverBackground">#3e3e42</Color>

Второй,измените код ColorAnimation, как показано ниже.

<ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="{StaticResource BuildItemMouseOverBackground}" Duration="0:0:0.5" />

И он будет работать хорошо.

Надеюсь, эта информация поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...