如何为 SolidColorBrush 资源制作动画?
How to animate SolidColorBrush resource?
我正在尝试制作 SolidColorBrush 的动画,它是我的自定义控件的资源。此画笔用作五个矩形的填充。
虽然在设计时间,一切都按预期工作,但在运行时间,应用程序立即关闭并显示System.InvalidOperationException, 指出找不到笔刷名称
我开始了一个示例项目,具有:
- 1 个画笔,我想制作动画
<SolidColorBrush x:Name="rectBrush" x:Key="rectangleBrush" Color="#b266b2" />
- 5 个矩形,使用该画笔填充。
<Grid>
<StackPanel
Orientation="Horizontal"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
</StackPanel>
</Grid>
我正在使用 Blend for Visual Studio 来查看故事板是否正确且有效。
启动时我得到:
System.InvalidOperationException: ''rectBrush' name cannot be found in the name scope of 'AnimationExample.MainWindow'
完成 XAML 标记:
<Window x:Class="AnimationExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="200">
<Window.Resources>
<SolidColorBrush x:Name="rectBrush" x:Key="rectangleBrush" Color="#b266b2" />
<Style TargetType="Rectangle">
<Setter Property="Width" Value="6" />
<Setter Property="Height" Value="6" />
<Setter Property="Margin" Value="1" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Bottom" />
<Setter Property="RadiusX" Value="3" />
<Setter Property="RadiusY" Value="3" />
</Style>
<Storyboard
x:Key="NowPlayingAnimation"
RepeatBehavior="Forever"
AutoReverse="True">
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#b266b2"
To="#6666ff"
Duration="0:0:1" />
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#6666ff"
To="#66b266"
Duration="0:0:1"
BeginTime="0:0:1"/>
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#66b266"
To="#ffff66"
Duration="0:0:1"
BeginTime="0:0:2"/>
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#ffff66"
To="#ffc966"
Duration="0:0:1"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#ffc966"
To="#ff4c4c"
Duration="0:0:1"
BeginTime="0:0:4" />
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource NowPlayingAnimation}"/>
</EventTrigger>
</Window.Triggers>
<Grid>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
</StackPanel>
</Grid>
</Window>
我有两个问题:
为什么在设计时一切正常而且我能够看到我真正想要得到的东西?
有办法实现吗?
- 完全在XAML;
- 没有单独对每个矩形的填充进行动画处理?
提前致谢。
您有两个选择:
- 将动画放在Style中,直接动起来
Background.Color
。
- 将画笔放在它或它的父级在可视化树中可以解析名称的地方。
版本 2:
<Window.Resources>
<SolidColorBrush x:Name="rectBrush" x:Key="rectangleBrush" Color="#b266b2" />
<Style TargetType="Rectangle">
<Setter Property="Width" Value="6" />
<Setter Property="Height" Value="6" />
<Setter Property="Margin" Value="1" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Bottom" />
<Setter Property="RadiusX" Value="3" />
<Setter Property="RadiusY" Value="3" />
</Style>
<Storyboard
x:Key="NowPlayingAnimation"
RepeatBehavior="Forever"
AutoReverse="True">
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#b266b2"
To="#6666ff"
Duration="0:0:1" />
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#6666ff"
To="#66b266"
Duration="0:0:1"
BeginTime="0:0:1"/>
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#66b266"
To="#ffff66"
Duration="0:0:1"
BeginTime="0:0:2"/>
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#ffff66"
To="#ffc966"
Duration="0:0:1"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#ffc966"
To="#ff4c4c"
Duration="0:0:1"
BeginTime="0:0:4" />
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource NowPlayingAnimation}"/>
</EventTrigger>
</Window.Triggers>
<Grid>
<FrameworkElement
x:Name="BrushCarrier"
Tag="{StaticResource rectangleBrush}"
/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
</StackPanel>
</Grid>
版本 1。在这里,情节提要未定义为资源,并且在加载 window 时不会启动它。每个 Rectangle 都负责自己的动画。
<Style TargetType="Rectangle" x:Key="ColorShiftRectangle">
<Setter Property="Width" Value="6" />
<Setter Property="Height" Value="6" />
<Setter Property="Margin" Value="1" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Bottom" />
<Setter Property="RadiusX" Value="3" />
<Setter Property="RadiusY" Value="3" />
<Setter Property="Fill" Value="#b266b2" />
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard
RepeatBehavior="Forever"
AutoReverse="True">
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#b266b2"
To="#6666ff"
Duration="0:0:1" />
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#6666ff"
To="#66b266"
Duration="0:0:1"
BeginTime="0:0:1"/>
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#66b266"
To="#ffff66"
Duration="0:0:1"
BeginTime="0:0:2"/>
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#ffff66"
To="#ffc966"
Duration="0:0:1"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#ffc966"
To="#ff4c4c"
Duration="0:0:1"
BeginTime="0:0:4" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
用法:
<Rectangle Style="{StaticResource ColorShiftRectangle}" />
我正在尝试制作 SolidColorBrush 的动画,它是我的自定义控件的资源。此画笔用作五个矩形的填充。
虽然在设计时间,一切都按预期工作,但在运行时间,应用程序立即关闭并显示System.InvalidOperationException, 指出找不到笔刷名称
我开始了一个示例项目,具有:
- 1 个画笔,我想制作动画
<SolidColorBrush x:Name="rectBrush" x:Key="rectangleBrush" Color="#b266b2" />
- 5 个矩形,使用该画笔填充。
<Grid>
<StackPanel
Orientation="Horizontal"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
<Rectangle
Fill="{StaticResource rectangleBrush}" />
</StackPanel>
</Grid>
我正在使用 Blend for Visual Studio 来查看故事板是否正确且有效。
启动时我得到:
System.InvalidOperationException: ''rectBrush' name cannot be found in the name scope of 'AnimationExample.MainWindow'
完成 XAML 标记:
<Window x:Class="AnimationExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="200">
<Window.Resources>
<SolidColorBrush x:Name="rectBrush" x:Key="rectangleBrush" Color="#b266b2" />
<Style TargetType="Rectangle">
<Setter Property="Width" Value="6" />
<Setter Property="Height" Value="6" />
<Setter Property="Margin" Value="1" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Bottom" />
<Setter Property="RadiusX" Value="3" />
<Setter Property="RadiusY" Value="3" />
</Style>
<Storyboard
x:Key="NowPlayingAnimation"
RepeatBehavior="Forever"
AutoReverse="True">
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#b266b2"
To="#6666ff"
Duration="0:0:1" />
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#6666ff"
To="#66b266"
Duration="0:0:1"
BeginTime="0:0:1"/>
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#66b266"
To="#ffff66"
Duration="0:0:1"
BeginTime="0:0:2"/>
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#ffff66"
To="#ffc966"
Duration="0:0:1"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetName="rectBrush"
Storyboard.TargetProperty="Color"
From="#ffc966"
To="#ff4c4c"
Duration="0:0:1"
BeginTime="0:0:4" />
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource NowPlayingAnimation}"/>
</EventTrigger>
</Window.Triggers>
<Grid>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
</StackPanel>
</Grid>
</Window>
我有两个问题:
为什么在设计时一切正常而且我能够看到我真正想要得到的东西?
有办法实现吗?
- 完全在XAML;
- 没有单独对每个矩形的填充进行动画处理?
提前致谢。
您有两个选择:
- 将动画放在Style中,直接动起来
Background.Color
。 - 将画笔放在它或它的父级在可视化树中可以解析名称的地方。
版本 2:
<Window.Resources>
<SolidColorBrush x:Name="rectBrush" x:Key="rectangleBrush" Color="#b266b2" />
<Style TargetType="Rectangle">
<Setter Property="Width" Value="6" />
<Setter Property="Height" Value="6" />
<Setter Property="Margin" Value="1" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Bottom" />
<Setter Property="RadiusX" Value="3" />
<Setter Property="RadiusY" Value="3" />
</Style>
<Storyboard
x:Key="NowPlayingAnimation"
RepeatBehavior="Forever"
AutoReverse="True">
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#b266b2"
To="#6666ff"
Duration="0:0:1" />
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#6666ff"
To="#66b266"
Duration="0:0:1"
BeginTime="0:0:1"/>
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#66b266"
To="#ffff66"
Duration="0:0:1"
BeginTime="0:0:2"/>
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#ffff66"
To="#ffc966"
Duration="0:0:1"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetName="BrushCarrier"
Storyboard.TargetProperty="Tag.Color"
From="#ffc966"
To="#ff4c4c"
Duration="0:0:1"
BeginTime="0:0:4" />
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource NowPlayingAnimation}"/>
</EventTrigger>
</Window.Triggers>
<Grid>
<FrameworkElement
x:Name="BrushCarrier"
Tag="{StaticResource rectangleBrush}"
/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
<Rectangle Fill="{StaticResource rectangleBrush}" />
</StackPanel>
</Grid>
版本 1。在这里,情节提要未定义为资源,并且在加载 window 时不会启动它。每个 Rectangle 都负责自己的动画。
<Style TargetType="Rectangle" x:Key="ColorShiftRectangle">
<Setter Property="Width" Value="6" />
<Setter Property="Height" Value="6" />
<Setter Property="Margin" Value="1" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Bottom" />
<Setter Property="RadiusX" Value="3" />
<Setter Property="RadiusY" Value="3" />
<Setter Property="Fill" Value="#b266b2" />
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard
RepeatBehavior="Forever"
AutoReverse="True">
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#b266b2"
To="#6666ff"
Duration="0:0:1" />
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#6666ff"
To="#66b266"
Duration="0:0:1"
BeginTime="0:0:1"/>
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#66b266"
To="#ffff66"
Duration="0:0:1"
BeginTime="0:0:2"/>
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#ffff66"
To="#ffc966"
Duration="0:0:1"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetProperty="Fill.Color"
From="#ffc966"
To="#ff4c4c"
Duration="0:0:1"
BeginTime="0:0:4" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
用法:
<Rectangle Style="{StaticResource ColorShiftRectangle}" />