WPF一个完整的GIF制作工具实例(Part2:时间轴控件的实现)

本文介绍了一个WPF时间轴控件的实现,该控件用于创建和编辑GIF动画帧,支持动态添加和删除帧,设置帧延迟时间,并能与绘图控件同步。通过FrameBindData类管理帧数据,使用ListView控件并结合Converter实现交互逻辑。文章分为几个步骤详细阐述了实现过程,并提供了相关博文链接。
摘要由CSDN通过智能技术生成

该时间轴控件可实现动画帧的动态添加、删除,设置每个帧的延迟时间,还可与绘图控件同步更新绘制,效果如下:

实现步骤:

1、由于每个动画帧里的帧素材可以各不相同,所以添加帧的绑定数据类FrameBindData.cs,源码如下:

    public partial class FrameBindData : INotifyPropertyChanged
    {
        public FrameBindData()
        {
            this.frameCount = 500;//默认延时500
        }

        private bool isFrameMaterials;
        /// <summary>
        /// 是否是帧素材项
        /// </summary>
        public bool IsFrameMaterials
        {
            get
            {
                return isFrameMaterials;
            }
            set
            {
                if (isFrameMaterials != value)
                {
                    isFrameMaterials = value;
                    OnPropertyChanged("IsFrameMaterials");
                }
            }
        }

        private int frameCount;
        /// <summary>
        /// 帧Index
        /// </summary>
        public int FrameCount
        {
            get
            {
                return frameCount;
            }
            set
            {
                if (frameCount != value)
                {
                    frameCount = value;
                    OnPropertyChanged("FrameCount");
                }
            }
        }

        private List<BindItemClass> itemList;
        /// <summary>
        /// 帧素材
        /// </summary>
        public List<BindItemClass> ItemList
        {
            get
            {
                if (itemList == null)
                {
                    itemList = new List<BindItemClass>();
                }
                return itemList;
            }
            set
            {
                if (itemList != value)
                {
                    itemList = value;
                }
            }
        }

        private BitmapImage thumpImage;
        /// <summary>
        /// 缩略图
        /// </summary>
        public BitmapImage ThumpImage
        {
            get
            {
                return thumpImage;
            }
            set
            {
                if (thumpImage != value)
                {
                    thumpImage = value;
                    OnPropertyChanged("ThumpImage");
                }
            }
        }

        private void OnPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

2、另外我们再添加一个GIF类用于添加背景图片和后台数据绑定

    public partial class GIFClass
    {
        /// <summary>
        /// 底图
        /// </summary>
        public BindItemClass BackgroundItem { get; set; }

        private ObservableCollection<FrameBindData> frameList;
        /// <summary>
        /// 帧列表
        /// </summary>
        public ObservableCollection<FrameBindData> FrameList
        {
            get
            {
                if (frameList == null)
                {
                    frameList = new ObservableCollection<FrameBindData>();
                    var tempShow = new FrameBindData();
                    tempShow.ThumpImage = ImageHelper.LoadBitmapImageByPath(AppDomain.CurrentDomain.BaseDirectory + "Images\\addpic.png");
                    tempShow.IsFrameMaterials = false;
                    frameList.Add(tempShow);
                }
                return frameList;
            }
            set
            {
                if (frameList != value)
                {
                    frameList = value;
                }
            }
        }
    }

3、时间轴控件使用ListView控件来实现,样式如下:

        <Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}">
            <Setter Property="AllowDrop" Value="False"/>
            <Setter Property="Cursor" Value ="Hand"/>
            <Setter Property="Margin" Value="0,10,0,0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListViewItem}">
                        <Border Name="frameBorder" BorderBrush="Gray" BorderThickness="1" CornerRadius="2" Width="90" Height="50">
                            <Border.Background>
                                <ImageBrush ImageSource="{Binding ThumpImage}" Stretch="Fill"></ImageBrush>
                            </Border.Background>
                            <Border Name="countBorder" Width="26" Height="15" Background="Black" Opacity="0.5" CornerRadius="2" VerticalAlignment="Top" HorizontalAlignment="Left" Visibility="{Binding IsFrameMaterials, Converter={StaticResource FrameCountConverter}}">
                                <TextBlock Name="tbCount" Text="{Binding FrameCount}" FontSize="10px" Foreground="#FFFFFF" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
                            </Border>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter TargetName="frameBorder" Property="BorderBrush" Value="Blue"></Setter>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="frameBorder" Property="BorderBrush" Value="Orange"></Setter>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="frameBorder" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RunnerDNA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值