Написах контрола и успешно създадох сценарий, за да предизвикам анимация по време на задействани събития. Той променя запълването на елипса за определен период от време. Вместо да пиша нов RadialGradientBrush
всеки път, когато трябва да променя запълването, предоставих две от тях в ресурсите.
РЕДАКТИРАНЕ: Имам Ellipse
, който е основният компонент на контролата и е това, което се влияе от анимацията. Изпълнението му е просто и изглежда така:
<Ellipse Name="myEllipse" Style="{StaticResource DimStyle}" />
Когато го добавя към сценария (вместо да споменавам четката като ресурс), моята анимация работи по предназначение. Когато споменавам четката като ресурс, получавам това изключение:
"Cannot find resource named 'IlluminatedStyle'. Resource names are case sensitive."
Вътре в разкадровката това е мястото, където в момента се споменава:
<UserControl.Resources>
<Storyboard x:Key="Foo">
<ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame KeyTime="0:0:0.01" Value="{StaticResource IlluminatedStyle}" />
<DiscreteObjectKeyFrame KeyTime="0:0:0.85" Value="{StaticResource DimStyle}" />
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
Стиловете са много идентични и само свойствата на GradientStop
цвета се различават, така че ще дам само един стил за пример.
Реферираният стил
<UserControl.Resources>
<Style x:Key="IlluminatedStyle" TargetType="Ellipse">
<Setter Property="Fill">
<Setter.Value>
<RadialGradientBrush>
<GradientStop Color="#FF215416" Offset="1"/>
<GradientStop Color="#FE38DA2E" Offset="0"/>
<GradientStop Color="#FE81FF79" Offset="0.688"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
И така, как да направя правилна препратка към стил като този в моя Storyboard
?
Забележка: Storyboard
и Style
се съдържат в един и същ етикет UserControl.Resources
, но са разбити за този пример.
РЕДАКТИРАНЕ
Поставих Style
преди Storyboard
в UserControl.Resources
и сега получавам изключение, което гласи:
"This Freezable cannot be frozen.
at System.Windows.Freezable.Freeze()
at System.Windows.Freezable.GetCurrentValueAsFrozen()
at System.Windows.Media.Animation.TimelineCollection.GetCurrentValueAsFrozenCore(Freezable source)
at System.Windows.Freezable.CloneCoreCommon(Freezable sourceFreezable, Boolean useCurrentValue, Boolean cloneFrozenValues)
at System.Windows.Media.Animation.Timeline.GetCurrentValueAsFrozenCore(Freezable sourceFreezable)
at System.Windows.Freezable.GetCurrentValueAsFrozen()
at System.Windows.Media.Animation.Clock..ctor(Timeline timeline)
at System.Windows.Media.Animation.TimelineGroup.AllocateClock()
at System.Windows.Media.Animation.Clock.AllocateClock(Timeline timeline, Boolean hasControllableRoot)"
Freezable
точно е параметърът наGetCurrentValueAsFrozenCore
(3-ти в стека на повикванията). Вие сте този с дебъгера тук, използвайте го. :-) - person Jon   schedule 02.12.2010