直接在在模版中用blend添加动画,默认会放在ControlTemplate 的 Resources下面,使用了多种方法都无法正确获取Storyboard。。
<ControlTemplate TargetType="{x:Type local:TWindow}"> <ControlTemplate .Resources> <Storyboard x:Key="PromptMessage"> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="promptGrid"> <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/> <DiscreteObjectKeyFrame KeyTime="0:0:1.5" Value="{x:Static Visibility.Collapsed}"/> </ObjectAnimationUsingKeyFrames> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="promptBorder"> <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/> <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/> <EasingDoubleKeyFrame KeyTime="0:0:1.5" Value="0.01"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </ControlTemplate .Resources> <Grid x:Name="PART_MainGrid" Margin="3"> </Grid> </ControlTemplate>
将动画移到Grid的Resources下面,通过Grid来找到动画。代码如下。
<ControlTemplate TargetType="{x:Type local:TWindow}"> <Grid x:Name="PART_MainGrid" Margin="3"> <Grid.Resources> <Storyboard x:Key="PromptMessage"> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="promptGrid"> <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/> <DiscreteObjectKeyFrame KeyTime="0:0:1.5" Value="{x:Static Visibility.Collapsed}"/> </ObjectAnimationUsingKeyFrames> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="promptBorder"> <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/> <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/> <EasingDoubleKeyFrame KeyTime="0:0:1.5" Value="0.01"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </Grid.Resources> </Grid> </ControlTemplate>
Grid rootGrid = this.GetTemplateChild("PART_MainGrid") as Grid; if (rootGrid != null) { Storyboard PromptMessage = (Storyboard)rootGrid.Resources["PromptMessage"]; }