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
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
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
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