You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:32:27