2012-05-09 12 views
10

Tengo una vista webcruzada en WP7, que inicialmente no tiene foco (el contenido es hittest Visible, por lo tanto, quita los scrollviewers hittestvisibilidad). Cuando establezco la visibilidad de su contenido en falso, puedo desplazarme por el visualizador de desplazamiento, pero solo después de levantar mi dedo y colocarlo de nuevo. Realmente me gustaría que el foco cambie, y después de esto, volver a aplicar el foco para poder deslizar después de que la vista de desplazamiento obtenga el foco, no esperar a que ocurra el siguiente evento de inicio de manipulación para disparar. Aquí está mi código:Manipulación de incendios iniciada manualmente en WP7

<UserControl 
x:Class="WTFApp.Resources.ViewControllers.DetailedItemContentControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:EiBaseApi.Animation;assembly=EiBaseApi" 
FontFamily="{StaticResource PhoneFontFamilyNormal}" 
FontSize="{StaticResource PhoneFontSizeNormal}" 
Foreground="{StaticResource PhoneForegroundBrush}" 
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480" 
shell:SystemTray.IsVisible="True" > 

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="10"/> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid.Resources> 
     <Storyboard x:Name="MediatedListBoxContentAnimator"> 
      <DoubleAnimation x:Name="MediatedAnimation" 
          Storyboard.TargetName="WebScrollViewMediator" 
          Storyboard.TargetProperty="ScrollableWidthMultiplier" > 
      </DoubleAnimation> 
     </Storyboard> 

    </Grid.Resources> 

    <ScrollViewer x:Name="Scroller" 
        HorizontalScrollBarVisibility="Auto" 
        VerticalScrollBarVisibility="Disabled" 
        ManipulationMode="Control" 
        Grid.Row="1" 
        Grid.RowSpan="2" > 
     <StackPanel Name="WebScrollView" Orientation="Horizontal"> 
      <UserControl Name="LeftContentControl" MinWidth="480" /> 
      <UserControl Name="MiddleContentControl" MinWidth="480" /> 
      <UserControl Name="RightContentControl" MinWidth="480" /> 
     </StackPanel> 
    </ScrollViewer> 
    <local:ScrollableItemAnimationMediator x:Name="WebScrollViewMediator" 
              ScrollViewer="{Binding ElementName=Scroller}"/>   
</Grid> 

en C#:

protected override void TouchFrameDelta(object sender, TouchFrameEventArgs e) 
    { 
     if (UserManipulating == ManipulationState.ManipulationStopped) 
     { 
      UserManipulating = ManipulationState.ManipulationStarted; 
      ManipulationStartingPoint = e.GetPrimaryTouchPoint(null).Position; 
     } 
     //if we are already manipulating the scrollviewer, we do nothing 
     if (UserManipulating != ManipulationState.ManipulationStarted) 
     { 
      return; 
     } 
     TouchPoint touchPoint = e.GetPrimaryTouchPoint(null); 
     float differenceStart = (float)(touchPoint.Position.X - ManipulationStartingPoint.X); 
     if (Math.Abs(differenceStart) >= 25) 
     { 
      if (BrowserListIsHitTestVisible) 
      { 
       BrowserListIsHitTestVisible = false; 
       MiddleContentControl.Focus(); 
       MiddleContentControl.UpdateLayout(); 
       return; 
      } 

      float differenceDelta = (float) (touchPoint.Position.X - ManipulationDeltaPoint.X); 
      if (touchPoint.Action == TouchAction.Up) 
      {      
       UserManipulating = ManipulationState.ManipilatingScrollViewCompleted; 
       OnManipulationCompleted(differenceDelta); 
      }       
     } 
     ManipulationDeltaPoint = touchPoint.Position;  
    } 

El TouchFrameDeltais un evento Touch.FrameReported. ¿Alguien tiene una n idea de por qué esto no funciona, y cómo solucionarlo? Gracias de antemano

+0

Para aclarar, el objetivo final es tener un panel de desplazamiento horizontal, con el contenido de tres controles de usuario apilados horizontalmente? En caso afirmativo, ¿no funcionaría el comportamiento de scrollviewer predeterminado para esto (establezca IsHitTestVisible en el scrollviewer de nuevo a verdadero)? – codechinchilla

+0

El problema es que cuando configuro IsHitTestVisible, o cualquier otro cambio en el diseño de entrada de usuario, se maneja después de que el usuario libera y reemplaza su dedo. Creo que tiene algo que ver con el evento de manipulación iniciada. Cuando el navegador dice "hittestvisibility", el evento "manipulationstartedevent" del scrollviewer no se activa, y solo en el próximo evento manipulationstarted detectará y manejará esto. Así que incluso cuando me desplazo horizontalmente, actualizo el diseño, hago todo tipo de cosas raras de actualización, el navegador aún está en la última versión visible y lo sigue siendo hasta que publico y vuelva a aplicar la entrada – GeekPeek

+0

¿Es posible proporcionar el xaml real que está utilizando para la página? De esa forma podemos tratar de reproducir el problema con mayor precisión. – codechinchilla

Respuesta

1

Solo para aclararlo, ManipulationStarted (y Completado) no se pueden disparar manualmente, ya que sus EventArgs están sellados sin ningún constructor público.

Lo que estás pidiendo, no es algo que considere posible. Debido a que su elemento hijo no es compatible inicialmente con ninguna interacción, los eventos no se incluirán en ella, incluso después de configurar IsHitTestVisible antes de realizar otro evento.

No puedo ver exactamente lo que está tratando de archivar aquí, pero jugar con el desplazamiento y WebBrowser no es algo que recomendaría para 7.0/7.5, ya que el control tiene una funcionalidad muy limitada.