2012-05-09 1 views
10

J'ai un Webscrollview dans WP7, qui initialement n'a pas le focus (le contenu est hittestVisible, donc enlève les scrollviewers hittestvisibility). Lorsque je définis la visibilité de son contenu sur false, je peux faire défiler le scrollviewer, mais seulement après avoir levé mon doigt et l'avoir replacé. Je voudrais vraiment que le focus se décale, et après cela réappliquer la mise au point pour que je puisse glisser après que la scrollview ait été mise au point, sans attendre que le prochain événement manipulationStarted se déclenche. Voici mon code:Manipulation de feu Commencée manuellement dans 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;  
    } 

Le TouchFrameDeltais un événement Touch.FrameReported. Est-ce que quelqu'un a une idée de pourquoi cela ne fonctionne pas, et comment y remédier? Merci d'avance

+0

Pour clarifier, l'objectif final est d'avoir un panneau de défilement horizontal, avec le contenu étant trois contrôles utilisateur empilés horizontalement? Si tel est le cas, le comportement par défaut du scrollviewer ne fonctionnerait-il pas pour cela (définissez IsHitTestVisible sur le scrollviewer sur true)? – codechinchilla

+0

Le problème est que lorsque je mets le IsHitTestVisible, ou tout autre changement de disposition d'entrée de l'utilisateur, est traité après que l'utilisateur libère et remplace son doigt. Ceci ayant quelque chose à voir avec la manipulation a commencé l'événement, je suppose. Lorsque le navigateur réclame la plus haute visibilité, les manipulations de scrollviewer ne sont pas déclenchées, et ce n'est que lors de l'événement manipulationstarted suivant qu'il attrape et manipule ceci. Donc, même lorsque je fais défiler horizontalement, mettre à jour la mise en page, faire toutes sortes de mise à jour bizarre, le navigateur est toujours visible et le reste jusqu'à ce que je relâche et réapplique – GeekPeek

+0

Est-il possible de fournir le xaml que vous utilisez pour la page? De cette façon, nous pouvons essayer de reproduire le problème plus précisément. – codechinchilla

Répondre

1

Juste pour clarifier pour vous, ManipulationStarted (et Terminé) ne peut pas être déclenché manuellement, car leurs EventArgs sont scellés sans aucun constructeur public. Ce que vous demandez n'est pas quelque chose que je considérerais comme possible. Étant donné que votre élément enfant ne prend en charge aucune interaction au départ, les événements ne seront pas retenus, même après avoir défini IsHitTestVisible avant d'effectuer un autre événement.

Je ne vois pas ce que vous essayez exactement d'archiver ici, mais jouer avec le défilement et le WebBrowser n'est pas quelque chose que je recommanderais pour 7.0/7.5, car le contrôle a des fonctionnalités très limitées.

Questions connexes