如何在 WPF 中使用故事板
how to use storyboards in WPF
我想重用在 resourcedictionnary
中定义并在 App.xaml
中引用的 storyboad
<Storyboard x:Key="ShowWindowStoryboard">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
这里是给出异常的代码
Storyboard sb = (FindResource("ShowWindowStoryboard") as Storyboard).Clone();
DoubleAnimation da0 = sb.Children[0] as DoubleAnimation;
/* Exception here da0 is null*/
Storyboard.SetTarget(da0, uc);
DoubleAnimation da1 = sb.Children[1] as DoubleAnimation;
Storyboard.SetTarget(da1, uc);
DoubleAnimation da2 = sb.Children[2] as DoubleAnimation;
Storyboard.SetTarget(da2, uc);
sb.Begin();
我也按预期检查了 sb.children.Count == 3
。
您必须将 TransformGroup 添加到 uc
控件的 RenderTransform。我将向图像添加一个 TransformGroup。同样适用于您的控件 uc
.
XAML
<Image Source="untitled.bmp" Name="ImgDemo">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform/>
</TransformGroup>
</Image.RenderTransform>
</Image>
如果你必须在后面的代码中添加 TransformGroup,你可以在调用之前使用以下内容 Story.Begin:
TransformGroup transformGroup = new TransformGroup();
transformGroup.Children.Add(new ScaleTransform(1,1));
uc.RenderTransform = transformGroup;
您的 Storyboard.TargetProperty
应该反映您希望故事板应用到的对象的签名。这就是您面临异常的原因。此外,您可能希望稍微更改一下 Storyboard 以实际查看对象的更改。喜欢,
<Storyboard x:Key="ShowWindowStoryboard">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="0.5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="0.5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="0.5" />
</DoubleAnimationUsingKeyFrames>
请注意,值已更改,因此动画会很明显。最后,我确实看到您调用故事板的代码没有使用正确的转换。所以你可能想考虑使用以下内容,
Storyboard sb = (FindResource("ShowWindowStoryboard") as Storyboard).Clone();
DoubleAnimationUsingKeyFrames da0 = sb.Children[0] as DoubleAnimationUsingKeyFrames;
Storyboard.SetTarget(da0, ImgDemo);
DoubleAnimationUsingKeyFrames da1 = sb.Children[1] as DoubleAnimationUsingKeyFrames;
Storyboard.SetTarget(da1, ImgDemo);
DoubleAnimationUsingKeyFrames da2 = sb.Children[2] as DoubleAnimationUsingKeyFrames;
Storyboard.SetTarget(da2, ImgDemo);
sb.Begin();
祝你好运!
我想重用在 resourcedictionnary
中定义并在 App.xaml
storyboad
<Storyboard x:Key="ShowWindowStoryboard">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
这里是给出异常的代码
Storyboard sb = (FindResource("ShowWindowStoryboard") as Storyboard).Clone();
DoubleAnimation da0 = sb.Children[0] as DoubleAnimation;
/* Exception here da0 is null*/
Storyboard.SetTarget(da0, uc);
DoubleAnimation da1 = sb.Children[1] as DoubleAnimation;
Storyboard.SetTarget(da1, uc);
DoubleAnimation da2 = sb.Children[2] as DoubleAnimation;
Storyboard.SetTarget(da2, uc);
sb.Begin();
我也按预期检查了 sb.children.Count == 3
。
您必须将 TransformGroup 添加到 uc
控件的 RenderTransform。我将向图像添加一个 TransformGroup。同样适用于您的控件 uc
.
XAML
<Image Source="untitled.bmp" Name="ImgDemo">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform/>
</TransformGroup>
</Image.RenderTransform>
</Image>
如果你必须在后面的代码中添加 TransformGroup,你可以在调用之前使用以下内容 Story.Begin:
TransformGroup transformGroup = new TransformGroup();
transformGroup.Children.Add(new ScaleTransform(1,1));
uc.RenderTransform = transformGroup;
您的 Storyboard.TargetProperty
应该反映您希望故事板应用到的对象的签名。这就是您面临异常的原因。此外,您可能希望稍微更改一下 Storyboard 以实际查看对象的更改。喜欢,
<Storyboard x:Key="ShowWindowStoryboard">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="0.5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="0.5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"
>
<EasingDoubleKeyFrame KeyTime="0:0:0.3"
Value="0.5" />
</DoubleAnimationUsingKeyFrames>
请注意,值已更改,因此动画会很明显。最后,我确实看到您调用故事板的代码没有使用正确的转换。所以你可能想考虑使用以下内容,
Storyboard sb = (FindResource("ShowWindowStoryboard") as Storyboard).Clone();
DoubleAnimationUsingKeyFrames da0 = sb.Children[0] as DoubleAnimationUsingKeyFrames;
Storyboard.SetTarget(da0, ImgDemo);
DoubleAnimationUsingKeyFrames da1 = sb.Children[1] as DoubleAnimationUsingKeyFrames;
Storyboard.SetTarget(da1, ImgDemo);
DoubleAnimationUsingKeyFrames da2 = sb.Children[2] as DoubleAnimationUsingKeyFrames;
Storyboard.SetTarget(da2, ImgDemo);
sb.Begin();
祝你好运!