Menganimasikan Gif di WPF

Saya menggunakan kode ini untuk Animasi gif di perpustakaan terpisah dan kode xaml di proyek utama saya:

<controls:GifImage GifSource="/project;component/Images/my.gif" Stretch="None" />

Animasi Gif (file terpisah):

public class GifImage : Image
    {
        #region Memmbers

        private GifBitmapDecoder _gifDecoder;
        private Int32Animation _animation;
        private bool _isInitialized;

        #endregion Memmbers

        #region Properties

        private int FrameIndex
        {
            get { return (int)GetValue(FrameIndexProperty); }
            set { SetValue(FrameIndexProperty, value); }
        }

        private static readonly DependencyProperty FrameIndexProperty =
         DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex)));

        private static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            GifImage image = obj as GifImage;
            image.Source = image._gifDecoder.Frames[(int)ev.NewValue];
        }

        /// <summary>
        /// Defines whether the animation starts on it's own
        /// </summary>
        public bool AutoStart
        {
            get { return (bool)GetValue(AutoStartProperty); }
            set { SetValue(AutoStartProperty, value); }
        }

        public static readonly DependencyProperty AutoStartProperty =
         DependencyProperty.Register("AutoStart", typeof(bool), typeof(GifImage), new UIPropertyMetadata(false, AutoStartPropertyChanged));

        private static void AutoStartPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            if ((bool)e.NewValue)
                (sender as GifImage).StartAnimation();
        }

        public string GifSource
        {
            get { return (string)GetValue(GifSourceProperty); }
            set { SetValue(GifSourceProperty, value); }
        }

        public static readonly DependencyProperty GifSourceProperty =
         DependencyProperty.Register("GifSource", typeof(string), typeof(GifImage), new UIPropertyMetadata(string.Empty, GifSourcePropertyChanged));

        private static void GifSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            // CARLO 20100622: Reinitialize animation everytime image is changed
            (sender as GifImage).Initialize();
        }

        #endregion Properties

        #region Private Instance Methods

        private void Initialize()
        {

            _gifDecoder = new GifBitmapDecoder(new Uri(String.Format("pack://application:,,,{0}", this.GifSource)), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            _animation = new Int32Animation(0, _gifDecoder.Frames.Count - 1, new Duration(new TimeSpan(0, 0, 0, _gifDecoder.Frames.Count / 10, (int)((_gifDecoder.Frames.Count / 10.0 - _gifDecoder.Frames.Count / 10) * 1000))));
            _animation.RepeatBehavior = RepeatBehavior.Forever;
            this.Source = _gifDecoder.Frames[0];

            _isInitialized = true;
        }

        #endregion Private Instance Methods

        #region Public Instance Methods

        /// <summary>
        /// Shows and starts the gif animation
        /// </summary>
        public void Show()
        {
            this.Visibility = Visibility.Visible;
            this.StartAnimation();
        }

        /// <summary>
        /// Hides and stops the gif animation
        /// </summary>
        public void Hide()
        {
            this.Visibility = Visibility.Collapsed;
            this.StopAnimation();
        }

        /// <summary>
        /// Starts the animation
        /// </summary>
        public void StartAnimation()
        {
            if (!_isInitialized)
                this.Initialize();

            BeginAnimation(FrameIndexProperty, _animation);
        }

        /// <summary>
        /// Stops the animation
        /// </summary>
        public void StopAnimation()
        {
            BeginAnimation(FrameIndexProperty, null);
        }

        #endregion Public Instance Methods
    }

tapi saya mendapatkan kesalahan:

Awalan URI tidak dikenali.

Saya tidak yakin mengapa saya mendapatkan kesalahan. Bisakah seseorang membantu saya?


person UFO    schedule 30.10.2013    source sumber
comment
Kode tersebut tampaknya berasal dari jawaban ini. Ada jawaban dengan suara lebih tinggi di halaman yang sama yang menggunakan paket NuGet yang disebut XamlAnimatedGif (nee WpfAnimatedGif), serta berbagai solusi lainnya.   -  person fadden    schedule 14.12.2019


Jawaban (3)


Ada cara yang lebih mudah untuk menampilkan animasi .gif di wpf - gunakan MediaElement

Contoh:

<MediaElement x:Name="myGif" MediaEnded="myGif_MediaEnded" UnloadedBehavior="Manual"     Source="file://C:\waiting.GIF" LoadedBehavior="Play" Stretch="None"/>

Jika Anda ingin .gif berulang tanpa henti tetapi hanya menentukan jumlah pengulangan yang terbatas dalam file .gif, Anda dapat mengaitkan MediaEnded dan memulai ulang animasinya (Pastikan untuk mengatur UnloadedBehavior ke Manual):

    private void myGif_MediaEnded(object sender, RoutedEventArgs e)
    {
        myGif.Position = new TimeSpan(0, 0, 1);
        myGif.Play();
    }
person edtheprogrammerguy    schedule 30.10.2013
comment
Bagaimana cara menentukan lokasi pemutaran GIF di layar? - person zetar; 13.07.2016
comment
@Wobbles - sebenarnya bukan alasan untuk memberi suara negatif. Terima kasih atas wawasannya - person edtheprogrammerguy; 18.07.2017
comment
@edtheprogrammerguy Jawaban memiliki aplikasi yang terbatas dan akan menimbulkan masalah bagi banyak pengguna, sehingga tidak memuaskan mengapa banyak pengguna datang ke sini untuk menganimasikan gif. - person Wobbles; 18.07.2017

Coba ini:

<controls:GifImage GifSource="/Images/my.gif" Stretch="None" />

BTW, saya menemukan menggunakan cara ini untuk memutar gif di wpf mungkin merusak beberapa gambar gif, dan saya bertanya-tanya mengapa...

person Chobits    schedule 12.11.2013
comment
Di mana Anda menemukan kendali itu? - person Magnus Ahlin; 24.06.2015

Saya tidak dapat mengambil pujian untuk ini tetapi inilah cara untuk melakukan ini hanya dalam XAML. Saya menambahkan properti "IsBusy" ke ViewModel saya untuk menampilkan/menyembunyikan spinner selama pemrosesan.

        <Image Name="Spinner" Source="Resources/spinner.gif" RenderTransformOrigin="0.5, 0.5">
            <Image.Triggers>
                <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard Storyboard.TargetName="Spinner" Storyboard.TargetProperty="RenderTransform.(RotateTransform.Angle)">
                                <DoubleAnimation From="0" To="360" BeginTime="0:0:0" Duration="0:0:2" RepeatBehavior="Forever" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Image.Triggers>
            <Image.RenderTransform>
                <RotateTransform Angle="0" />
            </Image.RenderTransform>
            <Image.Style>
                <Style TargetType="Image">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsBusy}" Value="False">
                            <Setter Property="Visibility" Value="Hidden"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>

Berikut tautan untuk solusi penulis.

person LawMan    schedule 16.08.2017
comment
ini hanya memutar gambar (gambar keluar gambar pertama jika sumbernya .gif) - person Mohammad Mahroz; 19.11.2017
comment
Halaman tertaut adalah tentang mengganti animasi pemintal GIF dengan solusi alternatif. Dua solusi diberikan, yang pertama ditunjukkan dalam jawaban (dan tidak relevan dengan pertanyaan). Yang lainnya menggunakan WPF Storyboard untuk menampilkan bingkai secara berurutan. Ini dieksplorasi lebih lanjut dalam jawaban ini. - person fadden; 14.12.2019