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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:46:47