Tüm yaptığım, denetimin stili içinde, PaneRoot
katmanının üst kısmında başka bir katman oluşturmak ve oradaki tüm hareketleri işlemek. Yeni katmanın dönüşümü nesnenin TranslateX
güncellenirken
<Grid x:Name="PaneRoot" ManipulationMode="TranslateX" Grid.ColumnSpan="2" HorizontalAlignment="Left" Background="{TemplateBinding PaneBackground}" Width="{Binding TemplateSettings.OpenPaneLength, RelativeSource={RelativeSource Mode=TemplatedParent}}">
<Grid.Clip>
<RectangleGeometry x:Name="PaneClipRectangle">
<RectangleGeometry.Transform>
<CompositeTransform x:Name="PaneClipRectangleTransform" />
</RectangleGeometry.Transform>
</RectangleGeometry>
</Grid.Clip>
<Grid.RenderTransform>
<CompositeTransform x:Name="PaneTransform" TranslateX="{Binding RenderTransform.TranslateX, ElementName=PanArea}" />
</Grid.RenderTransform>
<Border Child="{TemplateBinding Pane}" />
<Rectangle x:Name="HCPaneBorder" Fill="{ThemeResource SystemControlForegroundTransparentBrush}" HorizontalAlignment="Right" Visibility="Collapsed" Width="1" x:DeferLoadStrategy="Lazy" />
</Grid>
<!--a new layer here to handle all the gestures -->
<Grid x:Name="OverlayRoot" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding TemplateSettings.OpenPaneGridLength, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<!--the actual element for panning, manipulations happen here-->
<Rectangle x:Name="PanArea" Fill="Transparent" ManipulationMode="TranslateX" Width="{Binding PanAreaThreshold, RelativeSource={RelativeSource Mode=TemplatedParent}}" Grid.Column="1">
<Rectangle.RenderTransform>
<CompositeTransform TranslateX="{Binding PanAreaInitialTranslateX, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
</Rectangle.RenderTransform>
</Rectangle>
<!--this is used to dismiss this swipeable pane-->
<Rectangle x:Name="DismissLayer" Fill="Transparent" Grid.Column="2" />
</Grid>
, ben de senkronize kendi konumunu korumak için PaneRoot
's güncelleştiriyorum.
void OnManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
_panAreaTransform = PanArea.RenderTransform as CompositeTransform;
_paneRootTransform = PaneRoot.RenderTransform as CompositeTransform;
if (_panAreaTransform == null || _paneRootTransform == null)
{
throw new ArgumentException("Make sure you have copied the default style to Generic.xaml!!");
}
}
void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
var x = _panAreaTransform.TranslateX + e.Delta.Translation.X;
// keep the pan within the bountry
if (x < PanAreaInitialTranslateX || x > 0) return;
// while we are panning the PanArea on X axis, let's sync the PaneRoot's position X too
_paneRootTransform.TranslateX = _panAreaTransform.TranslateX = x;
}
void OnManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
var x = e.Velocities.Linear.X;
// ignore a little bit velocity (+/-0.1)
if (x <= -0.1)
{
CloseSwipeablePane();
}
else if (x > -0.1 && x < 0.1)
{
if (Math.Abs(_panAreaTransform.TranslateX) > Math.Abs(PanAreaInitialTranslateX)/2)
{
CloseSwipeablePane();
}
else
{
OpenSwipeablePane();
}
}
else
{
OpenSwipeablePane();
}
}
IsPaneOpen
mülkiyet sanal olmadığı için, etrafa eski sarmak için başka bir IsSwipeablePaneOpen
oluşturmak zorunda olduğunu unutmayın. Bu nedenle, IsPaneOpen
özelliğini kullanmak istediğinizde, bunun yerine IsSwipeablePaneOpen
kullanın.
Bu, GitHub'da oluşturduğum bir demo uygulamasında nasıl çalışır. Tam kaynak kodunu here bulabilirsiniz.

Kredi
- SplitView şablon Koen Zwikstra müthiş Visual Studio UWP templates den üretilmiştir.
- Sayfa animasyonları ve diğer bazı uygulamalar, Jerry Nixon'dan this post tarafından esinlenmiştir.
Jest ile harika bir çalışma! – Saurabh3321
Yakın zamanda GitHub repo'yu başka bir harika özellik ile güncelledim - 'IsPanSelectorEnabled' özelliği, bölmenin alt kısmında yukarı/aşağı kaydırarak bir menü öğesi seçmenize izin veriyor. Bu, kullanıcıların artık büyük telefonlara sahip olmalarına yardımcı olacağına inanıyorum, çünkü artık parmaklarını üst bölgeye ulaşmak için uzatmaya gerek yok! Canlı demo: https://www.youtube.com/watch?v=K47MHJFe4dQ –
Hey Justin, stokta splitview kontrolü (bindirme modu), gerçek mobil cihazda (10152 kurmak) slayt-animasyon sırasında herhangi bir gecikme yaşarsınız hamburger düğmesine basar mısın? – Saurabh3321