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