none
¿Cómo insertar GIFS animados a un proyecto WPF? RRS feed

  • Pregunta

  • Buenas, la pregunta es la del título.

    Con Windows Forms, cargando la imagen .gif en un objeto "Picture Box" el .gif aparece con su animación en tiempo de ejecución. Sin embargo en un proyecto WPF, al cargar el .gif en un objeto "Image", solo aparece el primer fotograma, no se reproduce la animación, queda como una imagen estática.

    ¿Cómo puedo cargar un gif animado en WPF? Lo que quiero es cargar una serie de Avatares que he hecho en .gif con cierta animación para darle dinamismo al proyecto.

    Muchas gracias de antemano
    lunes, 31 de agosto de 2009 9:53

Respuestas

  • necesitas explicitamente hacer una referencia a System.Windows.Forms.dll que se incluye en el framework. Además de esta también necesitas referenciar lel ensamblado de integración WindowsFormsIntegration.dll (C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll) Te falta añadir esas dos referencias en tu proyecto
    Oscar Avarez Guerras - Arquitecto Software en I3B (I+D+I) Blog:http://geeks.ms/blogs/oalvarez Por favor marca como respuesta si te ha ayudado esta respuesta
    miércoles, 2 de septiembre de 2009 8:21

Todas las respuestas

  • No puedes cargar un gif aninmado en un objeto inagen de wpf. Puedes utilizar el mediaelement

    <MediaElement LoadedBehavior="Play" Source="file://C:/anim.gif" />

    Tambien puedes utilizar WindowsFormsHost e insertar el control de windowsform
     
    <Window x:Class="GifExample.Window1"
       
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       
    xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
       
    xmlns:winForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
       
    Loaded="Window_Loaded" >
       
    <Grid>
           
    <wfi:WindowsFormsHost>
               
    <winForms:PictureBox x:Name="pictureBoxLoading">
               
    </winForms:PictureBox>
           
    </wfi:WindowsFormsHost>
       
    </Grid>
    </Window >


    o si quieres controlarlo,Estos links te explican como hacerlo

    http://www.codeproject.com/KB/WPF/animatedgifinwpf.aspx
    http://www.solidrockstable.com/blogs/PragmaticTSQL/Lists/Posts/Post.aspx?ID=37
    Oscar Avarez Guerras - Arquitecto Software en I3B (I+D+I) Blog:http://geeks.ms/blogs/oalvarez Por favor marca como respuesta si te ha ayudado esta respuesta
    lunes, 31 de agosto de 2009 11:30
  • Este es mi código (concretamente)
    Esta por depurar pero con Image funciona bien, lo he modificado para añadir lo que me pusiste. Pero me dice que no encuentra:

    Error    2    No se encontró el tipo 'wfi:WindowsFormsHost'. Compruebe que no falta una referencia a un ensamblado y que se han generado todos los ensamblados a los que se hace referencia.

    Error    3    No se encontró el tipo 'winForms:PictureBox'. Compruebe que no falta una referencia a un ensamblado y que se han generado todos los ensamblados a los que se hace referencia.


    <UserControl
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:winForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

        mc:Ignorable="d"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:il="clr- namespace:Microsoft.Expression.Interactivity.Layout;assembly=Microsoft.Expression.Interactions"
        x:Class="selecciondeusuarios.Personaje"
        x:Name="UserControl"
        d:DesignWidth="640" d:DesignHeight="480" Width="200" Height="250">
       
        <Grid x:Name="LayoutRoot" Width="200" Height="250">
            <TextBlock x:Name="NombreUser" VerticalAlignment="Bottom" Height="40" TextWrapping="Wrap" FontWeight="Bold" FontFamily="Ravie" FontSize="18.667" TextAlignment="Center" Opacity="0">
            </TextBlock>
            <wfi:WindowsFormsHost>
                <winForms:PictureBox x:Name="pictureBoxLoading">
                </winForms:PictureBox>
            </wfi:WindowsFormsHost>
        </Grid>

    </UserControl>

    Seguramente me falte algo, pero no lo encuentro
    miércoles, 2 de septiembre de 2009 8:11
  • necesitas explicitamente hacer una referencia a System.Windows.Forms.dll que se incluye en el framework. Además de esta también necesitas referenciar lel ensamblado de integración WindowsFormsIntegration.dll (C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll) Te falta añadir esas dos referencias en tu proyecto
    Oscar Avarez Guerras - Arquitecto Software en I3B (I+D+I) Blog:http://geeks.ms/blogs/oalvarez Por favor marca como respuesta si te ha ayudado esta respuesta
    miércoles, 2 de septiembre de 2009 8:21
  • Hola,

    Yo necesito mostrar un gif en la pantalla para indicar que se está realizando un proceso en segundo plano, estoy intentando usar el PictureBox pero no se que hay que poner en el code behind, solo encuentro ejemplos de imágenes, no de gifs. ¿alguna idea?

     

    Muchas gracias!

    miércoles, 16 de junio de 2010 10:08
  • Yo lo logré, en mi caso tenía que presentar una pantalla de inicio WPF con un gif animado y luego de ejecutar la presentación, tenía que cerrar esta ventana y abrir la ventana WPF del inicio de session... la pagina le llamé Busy.xaml

    He aqui el código en XAML

    <Window x:Class="WpfRetirosDepositos.Busy"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:gif="http://wpfanimatedgif.codeplex.com"
          xmlns:local="clr-namespace:WpfRetirosDepositos"
        Title="GCIT BIENVENIDO" BorderBrush="Transparent" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None" AllowsTransparency="True" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Height="480" Width="700">
        <Grid>
            <Image gif:ImageBehavior.RepeatBehavior="1x"
                   gif:ImageBehavior.AnimatedSource="/WpfRetirosDepositos;component/images/GCIT-PANTALLA-INICIO.gif"
                   />
            <Label Content="" Height="28" HorizontalAlignment="Left" Margin="720,0,0,0" x:Name="lblSeconds" VerticalAlignment="Top" Visibility="Hidden" />
        </Grid>
    </Window>

    y este es el código en C#

    using System;
    using System.Data;
    using System.Threading;
    using System.Windows;
    using System.Windows.Media.Imaging;
    //using System.Net.Mail;
    //using System.Data.SqlClient;
    using System.Windows.Media.Animation;
    using WpfAnimatedGif;
    using System.IO;

    namespace WpfRetirosDepositos
    {
        /// <summary>
        /// Lógica de interacción para Busy.xaml
        /// </summary>
        public partial class Busy : Window
        {
            System.Windows.Threading.DispatcherTimer Timer = new System.Windows.Threading.DispatcherTimer();
            public Busy()
            {
                try
                {


                    InitializeComponent();


                    Timer.Tick += new EventHandler(Timer_Tick);
                    Timer.Interval = new TimeSpan(0, 0, 5);

                    var ruta = new Uri(@"/WpfApplication1;component/Images/GCIT-PANTALLA-INICIO.gif", UriKind.Relative);
                    BitmapImage bi = new BitmapImage(ruta);//Image path goes here
                    System.Windows.Controls.Image image = new System.Windows.Controls.Image();
                    image.Source = bi;
                    image.Height = 750;
                    image.Width = 700;
                    image.BeginInit();
                    image.EndInit();
                    Timer.Start();
                    ImageBehavior.SetAnimatedSource(image, bi);//See http://wpfanimatedgif.codeplex.com/
                    ImageBehavior.SetRepeatBehavior(image, new RepeatBehavior(1));


                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: " + ex);
                }
            }

            void Timer_Tick(object sender, EventArgs e)
            {
                try
                {
                    lblSeconds.Content = DateTime.Now.Second;
                    Timer.Stop();
                    MainWindow menu = new MainWindow();
                    menu.Show();
                    this.Close();
                }
                catch (Exception ex)
                {

                }
            }

        }
    }

    El Timer lo use (4 segundos) para que se mostrara el gif animado... si no se usa el timer, el timeline del proyecto no permite que se muestren los gif animados. Espero que esto les ayude. 

    jueves, 9 de junio de 2016 19:30