Estoy tratando de crear una animación en la que cuando un usuario desplaza el "FrontScroll", la aplicación se desplaza automáticamente "BackgroundScroll", del mismo tamaño, al mismo desplazamiento a la misma velocidad. En capas entre el desplazamiento frontal y de fondo hay una imagen que me gustaría que permaneciera estática. La imagen del medio solo ocupa 1/4 de la pantalla, el resto de la imagen es transparente en png. Estoy tratando de crear el efecto de que otras imágenes aparezcan gradualmente sobre y detrás de la imagen estática cuando el usuario se desplaza.

Actualmente tengo un evento en ManipulationCompleted que funciona, sin embargo crea un efecto muy "nervioso", ya que el desplazamiento de fondo no se desplaza a la posición hasta que el usuario levanta el dedo de la pantalla. Me gustaría hacer que la animación sea instantánea, ya sea que la manipulación se haya completado o no, así mantiene los 2 ScrollViewers en perfecta sincronización. También en la actualidad, cuando un usuario "mueve" el ScrollViewer para moverse una distancia mayor, el evento ManipulationCompleted no se activa, por lo que los 2 ScrollViewers se desincronizan. También probé los eventos MouseWheel, MouseLeave, MouseMove pero ninguno obtuvo el efecto que estoy buscando.

¿Alguien sabe si lo que estoy tratando de hacer es posible con las API actuales en Windows Phone 7.5 y, de ser así, cualquier consejo sobre cómo puedo hacer esto sería muy apreciado?

A continuación, se muestran mis eventos actuales de XAML y CodeBehind.

        <ScrollViewer HorizontalAlignment="Center" Margin="0,0,0,0" Name="backgroundScroll" VerticalAlignment="Top"  Background="Transparent" MaxHeight="Infinity">
                <Image HorizontalAlignment="Center" Height="2000" Stretch="Fill" Source="background@2x.png" />
        </ScrollViewer>

        <Image Source="MiddleStatic@2x.png" HorizontalAlignment="Center" Name="MiddleStatic" Stretch="Fill" VerticalAlignment="Top" Margin="-1,-1,0,0" />

        <ScrollViewer   HorizontalAlignment="Center" Name="FrontScroll" VerticalAlignment="Top" MaxHeight="Infinity" MinHeight="0"  ManipulationCompleted="FrontScroll_ManipulationCompleted">
            <StackPanel Background="#00000000">
                <Image Height="2000" Source="FrontScrollImage@2x.png" HorizontalAlignment="Center" Name="FrontScroll" Stretch="Fill" />
            </StackPanel>
        </ScrollViewer>
    </Grid>


    private void FrontScroll_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
    {
        backgroundScroll.ScrollToVerticalOffset(((ScrollViewer)sender).VerticalOffset);
    }
0
BMac 29 may. 2012 a las 00:58
¿Puede mostrar un ejemplo de este comportamiento en un video / aplicación? No entiendo lo que estás buscando.
 – 
William Melani
29 may. 2012 a las 08:15

1 respuesta

La mejor respuesta

Desafortunadamente, debido a que no hay un evento Scroll para el WP7 ScrollViewer, no estoy seguro de que exista una manera "fluida" de mantener sincronizados los dos ScrollViewers.

Sin embargo, hay una manera de mantener sincronizados los ScrollViewers: cree un DispatcherTimer y establezca la propiedad Interval en un TimeSpan pequeño; 0,2 segundos, por ejemplo. En el controlador de eventos Tick, establezca VerticalOffset del segundo visor de desplazamiento en el desplazamiento vertical del primer visor de desplazamiento (como lo está haciendo en el evento ManipulationCompleted).

Todavía no será suave, pero el disparo del temporizador debería mantener el desplazamiento sincronizado.

0
codechinchilla 29 may. 2012 a las 01:57
Gracias Codechinchilla, como dijiste no es del todo suave, pero debería ser suficiente por ahora. Gracias de nuevo.
 – 
BMac
30 may. 2012 a las 02:02