2012-05-09 19 views
10

Ho una discussione sul Web in WP7, che inizialmente non ha il focus (il contenuto è hittestVisible, quindi toglie l'idea di scrollviewer hittestvisibility). Quando ho impostato la visibilità del suo contenuto su false, posso scorrere lo scrollviewer, ma solo dopo aver sollevato il dito e rimetterlo di nuovo in posizione. Mi piacerebbe molto che lo stato attivo si spostasse, e dopo questo riapplicare la messa a fuoco in modo da poter scorrere dopo che la vista a scorrimento ha ottenuto il fuoco, non aspettare che l'evento successivo di manipolazione venga attivato. Ecco il mio codice:Manipolazione degli incendi Avviata manualmente in 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> 

in 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;  
    } 

Il TouchFrameDeltais un evento Touch.FrameReported. Qualcuno ha idea di come questo non funzioni e come risolverlo? Grazie in anticipo

+0

Per chiarire, l'obiettivo finale è quello di avere un pannello a scorrimento orizzontale, con il contenuto di tre controlli utente impilati orizzontalmente? In caso affermativo, il comportamento di default dello scrollviewer non funzionerebbe per questo (impostare IsHitTestVisible su scrollviewer su true)? – codechinchilla

+0

Il problema è che, quando imposto IsHitTestVisible o qualsiasi altra modifica del layout di input dell'utente, viene gestito dopo che l'utente ha rilasciato e sostituito il dito. Questo ha qualcosa a che fare con la manipolazione dell'evento iniziato, immagino. Quando il browser rivendica l'hittestvisibility, il manipulationstartedevent dello scrollviewer non viene licenziato e solo al successivo evento manipulationstart prenderà e gestirà questo. Quindi, anche quando scorrono orizzontalmente, aggiorno il layout, faccio tutti i tipi di cose strane di aggiornamento, il browser è ancora hittestvisible e rimane così finché non rilascio e riapplichiamo input – GeekPeek

+0

È possibile fornire l'xaml effettivo che si sta utilizzando per la pagina? In questo modo possiamo provare a riprodurre il problema in modo più accurato. – codechinchilla

risposta

1

solo per chiarire per voi, ManipulationStarted (e completato) non può essere licenziato manualmente, come i loro EventArgs sono sigillate senza costruttori pubblici.

Quello che stai chiedendo, non è qualcosa che considererei possibile. Dal momento che l'elemento figlio non supporta inizialmente alcuna interazione, gli eventi non verranno fatti gorgogliare fino a esso, anche dopo aver impostato IsHitTestVisible prima di eseguire ancora un altro evento.

Non riesco a vedere cosa stai cercando esattamente di archiviare qui, ma scherzo con lo scorrimento e il WebBrowser non è qualcosa che consiglierei per 7.0/7.5, in quanto il controllo ha funzionalità molto limitate.