C sharp - GIF en WPF

   
Vista:

GIF en WPF

Publicado por mak00 (4 intervenciones) el 04/06/2014 10:41:27
Hay alguna manera sencilla de poner un gif a modo de "loading" mientras se está procesando alguna tarea pesada?

He intentado poner una ProgressBar en otro hilo pero siempre me da error... Luego he visto el BackgroungWorker, pero tendria que rehacer la app.... La verdad es que las referencias que he visto sobre implementar una barra de pogreso (el GIF todavia menos) en WPF no me han servido o no lo he sabido hacer. Hay alguna manera de implementar un segundo hilo con la barra o el GIF sin tener que reestructurar toda la app?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

GIF en WPF

Publicado por Pico (114 intervenciones) el 04/06/2014 12:02:48
Poniendo un ProgressBar en un hilo te dará error si intentas acceder a datos de otro hilo "a pelo". Lo único que tienes que hacer es acceder a ellos como hay que hacerlo. Si intentas acceder a un objeto usa el InvokeRequired de ese objeto para controlar los accesos.

http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

GIF en WPF

Publicado por mak00 (4 intervenciones) el 04/06/2014 12:54:41
Si pero en WPF y C#?

Te pongo mi código a ver si me puedes ayudar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            string destFolder = System.IO.Path.Combine(folderTarget);
 
            string destFolderDB1 = System.IO.Path.Combine(destFolder, "DB1.mdb");
            string destFolderDB2 = System.IO.Path.Combine(destFolder, "DB2.mdb");
            string destFolderDB3 = System.IO.Path.Combine(destFolder, "DB3.mdb");
 
            try
            {
 
                if (!System.IO.Directory.Exists(destFolder))
                {
                    System.IO.Directory.CreateDirectory(destFolder);
                }
 
                if (chkDB1.IsChecked == true)
                {
                    System.IO.File.Copy(sourcePathMaster, destFolderDB1, true);
                }
 
                if (chkDB2.IsChecked == true)
                {
                    System.IO.File.Copy(sourcePathAuto, destFolderDB2, true);
                }
 
                if (chkDB3.IsChecked == true)
                {
                    System.IO.File.Copy(sourcePathPolab, destFolderDB3, true);
                }
            }
 
            catch (IOException IOex)
            {
                MessageBox.Show("error: " + IOex);
            }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

GIF en WPF

Publicado por Pico (114 intervenciones) el 04/06/2014 22:12:57
http://msdn.microsoft.com/en-us/library/ms741870%28v=vs.110%29.aspx
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

GIF en WPF

Publicado por mak00 (4 intervenciones) el 05/06/2014 10:20:19
Gracias Pico me lo miro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

GIF en WPF

Publicado por mak00 (4 intervenciones) el 05/06/2014 11:44:43
Lo he mirado y no hay manera...

Lo he intentado aplicar a mi código pero da error, fíjate que los checkBox de la GUI no los modifico, pero si que los consulto para ver si estan checkeados, entonces error porque estan en otro hilo... buff me podrias poner un ejemplo? llevo dias dando vueltas al tema por foros pero no encuentro la solución....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

GIF en WPF

Publicado por Pico (114 intervenciones) el 05/06/2014 12:06:28
Claro, no puedes acceder a un objeto ni a una posición de memoria creado en un hilo desde otro hilo "a pelo". Las aplicaciones WPF tienen 2 hilos, por lo que pone en esa página. Como los objetos que se ven están en un hilo y el trabajo lo hace otro, para acceder tienes que usar el InvokeRequired. Lo explica bien en la página de el Guille

1
2
3
4
5
6
7
8
9
10
11
12
private void SetText2(string text)
{
    if(this.listBox1.InvokeRequired)
    {
        SetTextCallback2 d = new SetTextCallback2(SetText2);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.listBox1.Items.Add(text);
    }
}


Si desde otro hilo pones listBox1.Items.Add() te da error. Por eso tienes que preguntarle al listBox si se puede acceder a él, y eso se hace con Invokerequired. Si no puede, se espera hasta que pueda. Es lo que se llama sincronizar hilos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar