none
Mi primera aplicación, problemas con scrollviewer RRS feed

  • Pregunta

  • Hola, estoy programando mi primera aplicación para windows phone y quería comentar un problema que estoy teniendo a ver si alguien me puede ayudar. Tengo una imagen, un scrollviewer y un botón, la imagen la tengo dividida en frames(toda una fila horizontal de 100x100 cada frame) de tal manera que el scrollviewer solo muestra un frame, la idea es que si pulso el botón se genera un número aleatorio que decide que frame se va a mostrar:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
            scrollViewer1.ScrollToHorizontalOffset(random.Next(6) * 100);
    }   

    Este código no me da ningún problema, lo que pasa es que mi intención ahora es generar como si fuera el efecto de una ruleta, es decir si pulso el botón se genera una sucesión de frames hasta que se detenga la "ruleta", mi idea era hacer esto:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
            for (int i = 0; i < 10; i++)
            {
                scrollViewer1.ScrollToHorizontalOffset(random.Next(6) * 100);
                Thread.Sleep(500);
            }
    }

    Con este código lo único que consigo es hacer que tarde más, porque aunque se generen diez número aleatorios el scrollviewer no se actualiza hasta el final del bloque y por tanto solo muestra el último frame que ha salido. Alguien sabe qué puedo hacer para conseguir este efecto de esta manera o simplemente no se puede?

    Gracias de antemano.

    domingo, 6 de mayo de 2012 0:20

Respuestas

  • El problema es que thread.Sleep está bloqueando la UI. No puedo reproducir tu ejemplo, así que prueba otras alternativas como Thread.QueuUserWorkItem. Más info aqui

    Saludos,


    José Miguel Torres

    • Marcado como respuesta chals90 miércoles, 9 de mayo de 2012 11:08
    martes, 8 de mayo de 2012 8:05
  • Hola,

    Prueba hacerlo así..

    private void button1_Click(object sender, RoutedEventArgs e)
    {
            ThreadPool.QueueUserWorkItem (Go);
    }

    private void Go()
    {
            for (int i = 0; i < 10; i++)
            {
                var rnd = random.Next(6) * 100;
                Dispatcher.BeginInvoke(()=> { scrollViewer1.ScrollToHorizontalOffset(rnd); });

                Thread.Sleep(500);
            }}

    Salu2


    MCTS ADO.NET, MCTS WCF, MCTS WinForm, MCTS ASP.NET, MCPD Enterprise.

    Mi perfil: My geeks
    Colaborador: www.secondnug.com

    • Marcado como respuesta chals90 miércoles, 9 de mayo de 2012 11:08
    miércoles, 9 de mayo de 2012 8:32

Todas las respuestas

  • Hola,

    Prueba lo siguiente:

    Dispatcher.BeginInvoke(()=> 
    {
    for (int i = 0; i < 10; i++)
             {
                 scrollViewer1.ScrollToHorizontalOffset(random.Next(6) * 100);
                 Thread.Sleep(500);
             }
    });
     

    Y cuentanos....

    SAludos,


    José Miguel Torres

    lunes, 7 de mayo de 2012 11:13
  • con ese código sigue haciendo lo mismo, lo único que ha cambiado es que ahora cuando pulso el botón no se queda deshabilitado hasta que termina el for, pero por lo demás sigue igual, solo muestra el último cálculo, ¿con este código lo qué se hace es que el bucle se ejecute en otro hilo?

    Gracias.

    lunes, 7 de mayo de 2012 13:35
  • El problema es que thread.Sleep está bloqueando la UI. No puedo reproducir tu ejemplo, así que prueba otras alternativas como Thread.QueuUserWorkItem. Más info aqui

    Saludos,


    José Miguel Torres

    • Marcado como respuesta chals90 miércoles, 9 de mayo de 2012 11:08
    martes, 8 de mayo de 2012 8:05
  • Hola,

    Prueba hacerlo así..

    private void button1_Click(object sender, RoutedEventArgs e)
    {
            ThreadPool.QueueUserWorkItem (Go);
    }

    private void Go()
    {
            for (int i = 0; i < 10; i++)
            {
                var rnd = random.Next(6) * 100;
                Dispatcher.BeginInvoke(()=> { scrollViewer1.ScrollToHorizontalOffset(rnd); });

                Thread.Sleep(500);
            }}

    Salu2


    MCTS ADO.NET, MCTS WCF, MCTS WinForm, MCTS ASP.NET, MCPD Enterprise.

    Mi perfil: My geeks
    Colaborador: www.secondnug.com

    • Marcado como respuesta chals90 miércoles, 9 de mayo de 2012 11:08
    miércoles, 9 de mayo de 2012 8:32
  • si señor así si que funciona, lo único que he tenido que cambiar es que he tenido que declarar un object como parametro de entrada de la función go, pero bueno en el artículo que me había pasado jose miguel ya lo había visto así que no me ha llevado tiempo arreglar ese error. Muchísimas gracias a los dos.
    miércoles, 9 de mayo de 2012 11:07