WPF DataGrid按任务状态显示PNG与动态GIF的问题求助
解决WPF DataGrid中GIF资源显示与选择性旋转的问题
让我帮你逐一解决这两个问题:
问题1:GIF资源无法正常显示的修复
你遇到的GIF不显示问题,主要是因为在App.xaml中用BitmapImage预定义资源时,它默认只会加载GIF的第一帧,不会自动启动动画播放。另外还要确保资源的嵌入配置正确,我们可以通过以下步骤修复:
步骤1:检查GIF文件的项目属性
在Visual Studio中右键你的spinner.gif文件,设置:
- 生成操作:
Resource - 复制到输出目录:
如果较新则复制
步骤2:修改Converter,动态加载图片并配置GIF动画
移除App.xaml中所有的BitmapImage资源定义,然后修改StatusJobConverter的GetIcon方法,直接在代码中创建BitmapImage并为GIF添加必要的配置:
private object GetIcon(StatusJob statusJob) { var bitmap = new BitmapImage(); bitmap.BeginInit(); switch (statusJob) { case StatusJob.Success: bitmap.UriSource = new Uri("pack://application:,,,/MyApplication;component/images/success.png"); break; case StatusJob.Error: bitmap.UriSource = new Uri("pack://application:,,,/MyApplication;component/images/error.png"); break; case StatusJob.Executing: bitmap.UriSource = new Uri("pack://application:,,,/MyApplication;component/images/spinner.gif"); // 配置GIF动画播放的关键参数 bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.DecodePixelWidth = 16; // 匹配Image控件的尺寸,确保动画正常启动 break; default: return null; } bitmap.EndInit(); return bitmap; }
这样修改后,GIF会被正确加载并播放动画,PNG图片也能正常显示。
问题2:仅让执行中的GIF实现旋转效果
当前所有图片都会旋转,是因为你用了EventTrigger在Image.Loaded时就启动旋转动画,不管当前状态是什么。我们需要改用DataTrigger,根据任务状态来选择性触发动画:
修改DataTemplate代码
移除UserControl.Resources中的Spin360 Storyboard,然后替换DataGridTemplateColumn.CellTemplate中的DataTemplate内容:
<DataTemplate> <Image Source="{Binding Status,Converter={StaticResource StatusJobConverter}}" Width="16" Height="16" RenderTransformOrigin="0.5, 0.5"> <Image.RenderTransform> <RotateTransform Angle="0" /> </Image.RenderTransform> <Image.Style> <Style TargetType="Image"> <Style.Triggers> <!-- 仅当状态为Executing时启动旋转动画 --> <DataTrigger Binding="{Binding Status}" Value="{x:Static local:StatusJob.Executing}"> <DataTrigger.EnterActions> <BeginStoryboard x:Name="SpinStoryboard"> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="RenderTransform.(RotateTransform.Angle)" From="0" To="360" Duration="0:0:2" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> <!-- 当状态离开Executing时停止动画 --> <DataTrigger.ExitActions> <StopStoryboard BeginStoryboardName="SpinStoryboard"/> </DataTrigger.ExitActions> </DataTrigger> </Style.Triggers> </Style> </Image.Style> </Image> </DataTemplate>
说明
- 这里通过
DataTrigger绑定到当前数据的Status属性,只有当状态为Executing时才启动旋转动画; - 添加
ExitActions确保当任务状态从执行中切换到成功/失败时,动画会立即停止; - 移除了原来的
EventTrigger和固定的Storyboard,让动画的触发完全由数据状态控制。
内容的提问来源于stack exchange,提问作者SirCris85
相关产品推荐
相关产品推荐

