Browse Source

Add snapping sample to scroll viewer page

pull/9961/head
Emmanuel Hansen 3 years ago
parent
commit
bde380ebfa
  1. 139
      samples/ControlCatalog/Pages/ScrollViewerPage.xaml
  2. 37
      samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs
  3. 4
      src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

139
samples/ControlCatalog/Pages/ScrollViewerPage.xaml

@ -3,8 +3,8 @@
xmlns:pages="using:ControlCatalog.Pages"
x:Class="ControlCatalog.Pages.ScrollViewerPage"
x:DataType="pages:ScrollViewerPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">Allows for horizontal and vertical content scrolling.</TextBlock>
<StackPanel Orientation="Vertical" Spacing="20">
<TextBlock TextWrapping="Wrap" Classes="h2">Allows for horizontal and vertical content scrolling. Supports snapping on touch and pointer wheel scrolling.</TextBlock>
<Grid ColumnDefinitions="Auto, *">
<StackPanel Orientation="Vertical" Spacing="4">
@ -31,6 +31,141 @@
Source="/Assets/delicate-arch-896885_640.jpg" />
</ScrollViewer>
</Grid>
<Grid ColumnDefinitions="Auto, *">
<StackPanel Orientation="Vertical" Spacing="4">
<StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Text="Snap Point Type" />
<ComboBox Items="{Binding AvailableSnapPointsType}" SelectedItem="{Binding VerticalSnapPointsType}" />
</StackPanel>
<StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Text="Snap Point Alignment" />
<ComboBox Items="{Binding AvailableSnapPointsAlignment}" SelectedItem="{Binding VerticalSnapPointsAlignment}" />
</StackPanel>
<ToggleSwitch IsChecked="{Binding AreSnapPointsRegular}"
OffContent="No"
OnContent="Yes"
Content="Are Snap Points regular?" />
</StackPanel>
<ScrollViewer x:Name="VerticalSnapsScrollViewer"
Grid.Column="1"
Margin="5"
VerticalSnapPointsType="{Binding VerticalSnapPointsType}"
VerticalSnapPointsAlignment="{Binding VerticalSnapPointsAlignment}"
Width="400" Height="200"
HorizontalScrollBarVisibility="Disabled">
<StackPanel AreVerticalSnapPointsRegular="{Binding AreSnapPointsRegular}" Orientation="Vertical" HorizontalAlignment="Stretch">
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 1"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 2"/>
</Border>
<Border Padding="5, 10"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 3"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 4"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 5"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 6"/>
</Border>
<Border Padding="5,8"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 7"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 8"/>
</Border>
<Border Padding="5,4"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 9"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 10"/>
</Border>
<Border Padding="5,0"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 11"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 12"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 13"/>
</Border>
<Border Padding="5,20"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 14"/>
</Border>
<Border Padding="5"
BorderBrush="Red"
HorizontalAlignment="Stretch"
BorderThickness="1">
<TextBlock FontWeight="Bold"
Text="Child 15"/>
</Border>
</StackPanel>
</ScrollViewer>
</Grid>
</StackPanel>
</UserControl>

37
samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs

@ -11,6 +11,9 @@ namespace ControlCatalog.Pages
private bool _allowAutoHide;
private ScrollBarVisibility _horizontalScrollVisibility;
private ScrollBarVisibility _verticalScrollVisibility;
private SnapPointsType _verticalSnapPointsType;
private SnapPointsAlignment _verticalSnapPointsAlignment;
private bool _areSnapPointsRegular;
public ScrollViewerPageViewModel()
{
@ -22,6 +25,20 @@ namespace ControlCatalog.Pages
ScrollBarVisibility.Disabled,
};
AvailableSnapPointsType = new List<SnapPointsType>()
{
SnapPointsType.None,
SnapPointsType.Mandatory,
SnapPointsType.MandatorySingle
};
AvailableSnapPointsAlignment = new List<SnapPointsAlignment>()
{
SnapPointsAlignment.Near,
SnapPointsAlignment.Center,
SnapPointsAlignment.Far,
};
HorizontalScrollVisibility = ScrollBarVisibility.Auto;
VerticalScrollVisibility = ScrollBarVisibility.Auto;
AllowAutoHide = true;
@ -33,6 +50,12 @@ namespace ControlCatalog.Pages
set => this.RaiseAndSetIfChanged(ref _allowAutoHide, value);
}
public bool AreSnapPointsRegular
{
get => _areSnapPointsRegular;
set => this.RaiseAndSetIfChanged(ref _areSnapPointsRegular, value);
}
public ScrollBarVisibility HorizontalScrollVisibility
{
get => _horizontalScrollVisibility;
@ -45,7 +68,21 @@ namespace ControlCatalog.Pages
set => this.RaiseAndSetIfChanged(ref _verticalScrollVisibility, value);
}
public SnapPointsType VerticalSnapPointsType
{
get => _verticalSnapPointsType;
set => this.RaiseAndSetIfChanged(ref _verticalSnapPointsType, value);
}
public SnapPointsAlignment VerticalSnapPointsAlignment
{
get => _verticalSnapPointsAlignment;
set => this.RaiseAndSetIfChanged(ref _verticalSnapPointsAlignment, value);
}
public List<ScrollBarVisibility> AvailableVisibility { get; }
public List<SnapPointsType> AvailableSnapPointsType { get; }
public List<SnapPointsAlignment> AvailableSnapPointsAlignment { get; }
}
public class ScrollViewerPage : UserControl

4
src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

@ -613,7 +613,7 @@ namespace Avalonia.Controls.Presenters
{
height = _verticalSnapPoint;
}
else
else if(_verticalSnapPoints != null)
{
double yOffset = Offset.Y;
switch (VerticalSnapPointsAlignment)
@ -645,7 +645,7 @@ namespace Avalonia.Controls.Presenters
{
width = _horizontalSnapPoint;
}
else
else if(_horizontalSnapPoints != null)
{
double xOffset = Offset.X;
switch (VerticalSnapPointsAlignment)

Loading…
Cancel
Save