WPF中DataTrigger实现图标旋转无效,求排查代码问题
问题排查与修复
你的代码里图标不旋转的核心原因是Path未配置RotateTransform,动画找不到要修改的Angle属性,同时存在动画目标路径和停止逻辑的疏漏,具体修复如下:
1. 给Path添加RotateTransform
需要在Path中加入RenderTransform并包含RotateTransform,同时设置旋转中心(避免图标偏移):
<Path Name="IcoMissionState" Stretch="Fill"> <!-- 添加旋转变换配置 --> <Path.RenderTransform> <RotateTransform CenterX="10" CenterY="10"/> <!-- 对应Width/Height=20的中心位置 --> </Path.RenderTransform> <!-- 原有Style代码 --> </Path>
2. 修正动画的TargetProperty路径
原动画的属性路径不正确,需指定到RenderTransform下的RotateTransform:
<DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(RotateTransform.Angle)" AutoReverse="False" RepeatBehavior="Forever" From="0" To="-360" FillBehavior="HoldEnd" <!-- 改为HoldEnd,避免条件退出后角度重置 --> Duration="0:0:4" />
3. 添加动画停止逻辑(推荐)
当MultiDataTrigger的条件不再满足时,需停止动画,否则动画会持续播放。给BeginStoryboard命名并添加ExitActions:
<MultiDataTrigger.EnterActions> <BeginStoryboard Name="RotateStoryboard"> <!-- 给BeginStoryboard命名 --> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(RotateTransform.Angle)" AutoReverse="False" RepeatBehavior="Forever" From="0" To="-360" FillBehavior="HoldEnd" Duration="0:0:4" /> </Storyboard> </BeginStoryboard> </MultiDataTrigger.EnterActions> <!-- 添加退出时停止动画的逻辑 --> <MultiDataTrigger.ExitActions> <StopStoryboard BeginStoryboardName="RotateStoryboard"/> </MultiDataTrigger.ExitActions>
完整修复后的代码
<Canvas ClipToBounds="True" Margin="0,0,0,0" Width="27" Height="27" HorizontalAlignment="Center"> <Path Name="IcoMissionState" Stretch="Fill"> <Path.RenderTransform> <RotateTransform CenterX="10" CenterY="10"/> </Path.RenderTransform> <Path.Style> <Style TargetType="{x:Type Path}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=[StatoMissione]}" Value="2"> <Setter Property="Data" Value="{DynamicResource IcoMSPrenotato}"/> <Setter Property="Width" Value="20"/> <Setter Property="Height" Value="20"/> <Setter Property="ToolTip" Value="Prenotato"/> </DataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Value="False"/> <Condition Binding="{Binding Path=[StatoMissione]}" Value="3"/> </MultiDataTrigger.Conditions> <Setter Property="Fill" Value="{DynamicResource Scb_Blu_02}"/> <Setter Property="Data" Value="{DynamicResource IcoMSInEsecuzione}"/> <Setter Property="Width" Value="20"/> <Setter Property="Height" Value="20"/> <Setter Property="ToolTip" Value="In esecuzione"/> <MultiDataTrigger.EnterActions> <BeginStoryboard Name="RotateStoryboard"> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(RotateTransform.Angle)" AutoReverse="False" RepeatBehavior="Forever" From="0" To="-360" FillBehavior="HoldEnd" Duration="0:0:4" /> </Storyboard> </BeginStoryboard> </MultiDataTrigger.EnterActions> <MultiDataTrigger.ExitActions> <StopStoryboard BeginStoryboardName="RotateStoryboard"/> </MultiDataTrigger.ExitActions> </MultiDataTrigger> </Style.Triggers> </Style> </Path.Style> </Path> </Canvas>
内容的提问来源于stack exchange,提问作者user20182161
相关产品推荐
相关产品推荐

