2012-04-17 1 views
2

У меня есть следующий код: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}" со стола.

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

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

+0

http://stackoverflow.com/a/10196078/452941 –

ответ

2

я придумал, как сделать это со слоями. Сделайте несколько копий объекта, а затем просто изменить прозрачные пленки, как это:

<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> 
3

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

+0

Как я должен изменить свой код, чтобы исправить это? – 0x4f3759df

+0

@iterationx: используйте StaticResource. – Phil

+0

@Phil Я хочу изменить цвета во время выполнения – 0x4f3759df

5

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

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

  • Попробуйте объявить ресурс как StaticResource и использовать его в ваш VSM. StaticResource explanation for VSM

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

  • И наконец, если вы хотите придерживаться этого, используя анимацию, вы можете достичь этого в code behind. Эти сообщения могли бы оказывается полезным для вас - Woakaround for dynamicResource in Animation, Animation in code behind и Setting foreground with VSM

+0

Золото - это только цвет по умолчанию , Я хочу, чтобы он был динамически настроен. Я думаю, что это исключает первые два момента. Все еще думая о третьем. – 0x4f3759df

+1

Вы меня поместили по правильному пути, поэтому я дал вам очки. – 0x4f3759df

 Смежные вопросы

  • Нет связанных вопросов^_^