Цвет DynamicResource не работает

У меня есть следующий код:

<Color x:Key="SelectedColor">Gold</Color> 

И стиль TabItem, содержащий цвет

<VisualState x:Name="Selected">
    <Storyboard>
        <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)"
            Storyboard.TargetName="InnerRectangle2">
            <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource SelectedColor}"/>
        </ColorAnimationUsingKeyFrames>

Оказывается, я не могу использовать DynamicResource на EasingColorKeyFrame.
Что я могу сделать, чтобы добиться нужного эффекта?

Мне нужно установить цвет динамически, поэтому просто поменять местами "{DynamicResource SelectedColor}" с "{StaticResource SelectedColor}" нельзя.

Я создал крошечное решение, чтобы продемонстрировать проблему - вкладка «Выбранные» должна быть золотого цвета, но на самом деле она прозрачная, потому что я предполагаю, что VSM не может разрешить цвет с именем «SelectedColor».

http://dl.dropbox.com/u/10557283/DynamicBug.zip


person patrick    schedule 17.04.2012    source источник
comment
stackoverflow.com/a/10196078/452941   -  person denis morozov    schedule 17.04.2012


Ответы (3)


Анимации (VSM) freezable objects. Как только вы установите привязку к свойству зависимостей Freezable, вы предотвратите замораживание Freezable. Таким образом, привязки к свойству Value вашего EasingColorKeyFrame objects are preventing the storyboards from being frozen.

В качестве выхода вы можете попробовать любые из этих трех подходов, которые вам больше подходят -

  • Попробуйте объявить ресурс как StaticResource и использовать его в своем VSM. Объяснение StaticResource для VSM

  • Насколько я понимаю из вашего кода, вы хотите, чтобы выбранный tabItem был золотым цветом. Таким образом, в качестве обходного пути вы можете сделать так, чтобы two borders, содержащиеся в панели, говорили, что сетка одна над другой с золотой рамкой по умолчанию visibility как свернутая, а обычная видна. Теперь, на selected event (при изменении свойства IsSelected или любого другого подхода) вашего tabItem вы можете swap the visibility двух границ, дающих тот же эффект. Конечно, этот обходной путь специфичен для этого случая, например, он имеет смысл только в том случае, если ключевое время EasingColorKeyFrame равно 0, в противном случае он не дает такого же визуального эффекта.

  • Наконец, если вы хотите сделать это с помощью анимации, вы можете сделать это в code behind. Эти сообщения могут оказаться полезными для вас — Woakaround for dynamicResource в анимации, Анимация в коде позади и Настройка переднего плана с помощью VSM

person Rohit Vats    schedule 23.07.2012
comment
Золото - это просто цвет по умолчанию, я хочу, чтобы он устанавливался динамически. Я думаю, что это исключает первые два пункта. Все еще думаю о третьем. - person patrick; 24.07.2012

Это связано с тем, что типы VSM не являются частью логического дерева, поэтому динамический поиск ресурсов не может быть разрешен.

person Kent Boogaart    schedule 17.04.2012
comment
@iterationx: используйте StaticResource. - person Phil; 26.04.2012
comment
@Phil Я хочу изменить цвета во время выполнения - person patrick; 26.04.2012
comment
переместите EasingColorKeyFrame в ресурсы вне VSM, укажите цвет как динамический ресурс и укажите EasingColorKeyFrame в ColorAnimationUsingKeyFrames как статические ресурсы. что-то вроде этого должно работать - person koshdim; 30.04.2012
comment
@koshdim Как я могу переместить EasingColorKeyFrame? ColorAnimationUsingKeyFrames не имеет свойства Value, обычно я бы сделал Value={StaticResource X} , но в данном случае я не могу этого сделать? - person patrick; 23.07.2012

Я нашел способ сделать это со слоями. Сделайте несколько копий вашего объекта, а затем просто измените прозрачность следующим образом:

<VisualState x:Name="Selected">
    <Storyboard>
        <DoubleAnimation Storyboard.TargetName="InnerRectangleBorder"
                         Storyboard.TargetProperty="Opacity"
                         To="0"
                         Duration="0:0:0" />

        <DoubleAnimation Storyboard.TargetName="InnerRectangleBorderMouseOver"
                         Storyboard.TargetProperty="Opacity"
                         To="0"
                         Duration="0:0:0.5" />

        <DoubleAnimation Storyboard.TargetName="InnerRectangleBorderSelected"
                         Storyboard.TargetProperty="Opacity"
                         To="1"
                         Duration="0:0:1" />
    </Storyboard>
</VisualState>
person patrick    schedule 24.07.2012