WPF中ColorAnimation触发时影响同类型所有对象的问题求助
问题描述
我有两组类型相同但完全独立的ToggleButton控件,它们的ControlTemplate中均定义了ColorAnimation。奇怪的是,当触发其中一个控件的ColorAnimation时,所有同类型控件的该动画都会被激活;而DoubleAnimation等其他动画则能正常独立工作。
问题代码
<Style TargetType="ToggleButton" x:Key="ToggleButtonStyle"> <Setter Property="Width" Value="50"/> <Setter Property="Height" Value="20"/> <Setter Property="FontSize" Value="15"/> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <ControlTemplate.Resources> <SolidColorBrush x:Key="HoverBrush" Color="{Binding Source={StaticResource MainHoverColor}, Path=Color}"/> <SolidColorBrush x:Key="BorderBackground" Color="{Binding Source={StaticResource TogglerBackground}, Path=Color}"/> </ControlTemplate.Resources> <Border x:Name="PART_Border" Background="{StaticResource BorderBackground}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Tag="{TemplateBinding Tag}" CornerRadius="10"> <Button x:Name="PART_Toggler" HorizontalAlignment="Left" Width="{TemplateBinding FontSize}" Height="{TemplateBinding FontSize}" IsHitTestVisible="False" Margin="3 0 0 0"> <Button.Template> <ControlTemplate> <Ellipse Fill="White"/> </ControlTemplate> </Button.Template> </Button> </Border> <ControlTemplate.Triggers> <EventTrigger RoutedEvent="Checked"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <ThicknessAnimation Duration="0:0:0.200" Storyboard.TargetName="PART_Toggler" Storyboard.TargetProperty="Margin" To="32,0,0,0"/> </Storyboard> </BeginStoryboard> <BeginStoryboard> <Storyboard> <ColorAnimation Duration="0:0:0.200" Storyboard.TargetName="PART_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" To="Red"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> <EventTrigger RoutedEvent="Unchecked"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <ThicknessAnimation Duration="0:0:0.200" Storyboard.TargetName="PART_Toggler" Storyboard.TargetProperty="Margin" To="3,0,0,0"/> </Storyboard> </BeginStoryboard> <BeginStoryboard> <Storyboard> <ColorAnimation Duration="0:0:0.200" Storyboard.TargetName="PART_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" To="Black"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
问题原因
SolidColorBrush是引用类型,WPF中资源字典里的对象默认是共享状态(x:Shared属性默认值为True)。这意味着所有使用该Style的ToggleButton实例,都会共用同一个BorderBackground Brush对象。当ColorAnimation修改这个Brush的Color属性时,所有引用该Brush的控件背景都会同步变化。
而Thickness是值类型,每个控件的Margin属性都是独立实例,所以ThicknessAnimation只会修改当前控件的Margin,不会影响其他控件。
解决方案
给ControlTemplate资源中的BorderBackground添加x:Shared="False"属性,让每个ToggleButton实例都创建专属的Brush副本,动画就只会作用于触发的控件本身。
修改后的资源定义:
<ControlTemplate.Resources> <SolidColorBrush x:Key="HoverBrush" Color="{Binding Source={StaticResource MainHoverColor}, Path=Color}"/> <SolidColorBrush x:Key="BorderBackground" x:Shared="False" Color="{Binding Source={StaticResource TogglerBackground}, Path=Color}"/> </ControlTemplate.Resources>
内容的提问来源于stack exchange,提问作者Ihsan Nurul Iman
相关产品推荐
相关产品推荐

