[源码下载]

背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom

作者:webabcd

介绍
背水一战 Windows 10 之 控件(ScrollViewer 特性)

  • Chaining - 锁链
  • Rail - 轨道
  • Inertia - 惯性
  • Snap - 对齐
  • Zoom - 缩放

示例
1、演示 ScrollViewer 的 Chaining 特性
Controls/ScrollViewerDemo/Chaining.xaml

<Page
x:Class="Windows10.Controls.ScrollViewerDemo.Chaining"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Controls.ScrollViewerDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <ScrollViewer HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled">
<StackPanel> <CheckBox Name="chkIsHorizontalScrollChainingEnabled" Content="IsHorizontalScrollChainingEnabled" IsChecked="True" Margin="5" />
<CheckBox Name="chkIsVerticalScrollChainingEnabled" Content="IsVerticalScrollChainingEnabled" IsChecked="True" Margin="5" /> <TextBlock Text="我是参照物" Margin="5" /> <!--
Chaining: 锁链,在触摸模式下,滚动本 ScrollViewer 如果超出了边界,则滚动其父 ScrollViewer
本例的测试方法:在触摸模式下,滚动 ScrollViewer 内的内容直至超出边界,超出边界后不要停下来继续滚动,通过“我是参照物”观察父 ScrollViewer 是否也被滚动 IsHorizontalScrollChainingEnabled - 是否启用水平方向上的 Chaining,默认值为 true
IsVerticalScrollChainingEnabled - 是否启用垂直方向上的 Chaining,默认值为 true
--> <ScrollViewer Name="scrollViewer" Width="400" Height="400" Margin="5" HorizontalAlignment="Left"
HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled"
HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
IsHorizontalScrollChainingEnabled="{Binding IsChecked, ElementName=chkIsHorizontalScrollChainingEnabled}"
IsVerticalScrollChainingEnabled="{Binding IsChecked, ElementName=chkIsVerticalScrollChainingEnabled}">
<Image Source="/Assets/StoreLogo.png" Width="1000" />
</ScrollViewer> </StackPanel>
</ScrollViewer> </StackPanel>
</Grid>
</Page>

2、演示 ScrollViewer 的 Rail 特性
Controls/ScrollViewerDemo/Rail.xaml

<Page
x:Class="Windows10.Controls.ScrollViewerDemo.Rail"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Controls.ScrollViewerDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <CheckBox Name="chkIsHorizontalRailEnabled" Content="IsHorizontalRailEnabled" IsChecked="True" Margin="5" />
<CheckBox Name="chkIsVerticalRailEnabled" Content="IsVerticalRailEnabled" IsChecked="True" Margin="5" /> <!--
Rail: 轨道,在触摸模式下,假设沿水平方向滚动,则由于轨道的作用,在松手前只能延水平方向滚动(即使手指有垂直方向的滚动也无用) IsHorizontalRailEnabled - 是否启用水平方向上的轨道,默认值为 true
IsVerticalRailEnabled - 是否启用垂直方向上的轨道,默认值为 true
--> <ScrollViewer Name="scrollViewer" Width="400" Height="400" Margin="5" HorizontalAlignment="Left"
HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled"
HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
IsHorizontalRailEnabled="{Binding IsChecked, ElementName=chkIsHorizontalRailEnabled}"
IsVerticalRailEnabled="{Binding IsChecked, ElementName=chkIsVerticalRailEnabled}">
<Image Source="/Assets/StoreLogo.png" Width="1000" />
</ScrollViewer> </StackPanel>
</Grid>
</Page>

3、演示 ScrollViewer 的 Inertia 特性
Controls/ScrollViewerDemo/Inertia.xaml

<Page
x:Class="Windows10.Controls.ScrollViewerDemo.Inertia"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Controls.ScrollViewerDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <CheckBox Name="chkIsScrollInertiaEnabled" Content="IsScrollInertiaEnabled" IsChecked="True" Margin="5" /> <!--
Inertia: 惯性,在触摸模式下,用一个加速度滚动内容,松手后内容会具有惯性滚动效果 IsScrollInertiaEnabled - 是否启用惯性效果,默认值为 true
--> <ScrollViewer Name="scrollViewer" Width="400" Height="400" Margin="5" HorizontalAlignment="Left"
HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled"
HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
IsScrollInertiaEnabled="{Binding IsChecked, ElementName=chkIsScrollInertiaEnabled}">
<Image Source="/Assets/StoreLogo.png" Width="1000" />
</ScrollViewer> </StackPanel>
</Grid>
</Page>

4、演示 ScrollViewer 的 Snap 特性
Controls/ScrollViewerDemo/Snap.xaml

<Page
x:Class="Windows10.Controls.ScrollViewerDemo.Snap"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Controls.ScrollViewerDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <!--用于设置 ScrollViewer 的 HorizontalSnapPointsType-->
<ComboBox Name="comboBox" SelectedIndex="0" SelectionChanged="comboBox_SelectionChanged" HorizontalAlignment="Left" Margin="5">
<ComboBoxItem>HorizontalSnapPointsType = SnapPointsType.None</ComboBoxItem>
<ComboBoxItem>HorizontalSnapPointsType = SnapPointsType.Optional</ComboBoxItem>
<ComboBoxItem>HorizontalSnapPointsType = SnapPointsType.Mandatory</ComboBoxItem>
</ComboBox> <ScrollViewer x:Name="scrollViewer" Width="400" Height="200" HorizontalAlignment="Left" Margin="5"
HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled"
HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
<StackPanel Orientation="Horizontal">
<Image Width="400" Height="200" Stretch="Fill" Source="/Assets/StoreLogo.png" />
<Image Width="400" Height="200" Stretch="Fill" Source="/Assets/StoreLogo.png" />
<Image Width="350" Height="200" Stretch="Fill" Source="/Assets/StoreLogo.png" />
<Image Width="450" Height="200" Stretch="Fill" Source="/Assets/StoreLogo.png" />
<Image Width="400" Height="200" Stretch="Fill" Source="/Assets/StoreLogo.png" /> <TextBox Width="400" Height="200" FontSize="24" Text="message1" Name="txtMsg1" />
<TextBox Width="400" Height="200" FontSize="24" Text="message2" Name="txtMsg2" />
<TextBox Width="400" Height="200" FontSize="24" Text="message3" Name="txtMsg3" />
</StackPanel>
</ScrollViewer> <!--用于演示通过程序定位到 ScrollViewer 内的指定元素-->
<Button Name="btnScroll" Content="滚动到 txtMsg2" Click="btnScroll_Click" Margin="5" /> </StackPanel>
</Grid>
</Page>

Controls/ScrollViewerDemo/Snap.xaml.cs

/*
* Snap: 对齐,在触摸模式下,如果 ScrollViewer 有多个元素,在滚动结束后会定位到其中某一个具体的元素,这就叫对齐
*
* HorizontalSnapPointsType - 水平方向上的对齐行为,Windows.UI.Xaml.Controls.SnapPointsType枚举
* SnapPointsType.None - 不需要对齐,默认值
* SnapPointsType.Optional - 看情况,如果离某个元素很近则对齐此元素
* SnapPointsType.Mandatory - 强制对齐,必须对齐到某一元素
* SnapPointsType.OptionalSingle - 仅对 Zoom 对齐有用(参看 /Controls/ScrollViewerDemo/Zoom.xaml)
* SnapPointsType.MandatorySingle - 仅对 Zoom 对齐有用(参看 /Controls/ScrollViewerDemo/Zoom.xaml)
* VerticalSnapPointsType - 垂直方向上的对齐行为
*
*
* HorizontalSnapPointsAlignment - 水平方向上的对齐方式,Windows.UI.Xaml.Controls.Primitives.SnapPointsAlignment枚举
* SnapPointsAlignment.Near - 元素的左侧对齐 ScrollViewer 的左侧边界,默认值
* SnapPointsAlignment.Center - 元素的中心点对齐 ScrollViewer 的中心点
* SnapPointsAlignment.Far - 元素的右侧对齐 ScrollViewer 的右侧边界
* VerticalSnapPointsAlignment - 垂直方向上的对齐方式
*
*
* BringIntoViewOnFocusChange - ScrollViewer 内的某元素获得焦点后,是否需要定位到此元素,默认值为 true
*/ using Windows.UI.Xaml.Controls; namespace Windows10.Controls.ScrollViewerDemo
{
public sealed partial class Snap : Page
{
public Snap()
{
this.InitializeComponent();
this.Loaded += Snap_Loaded;
} void Snap_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
scrollViewer.HorizontalSnapPointsAlignment = Windows.UI.Xaml.Controls.Primitives.SnapPointsAlignment.Near;
scrollViewer.BringIntoViewOnFocusChange = true;
} private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (scrollViewer != null && comboBox != null)
{
switch (comboBox.SelectedIndex)
{
case :
scrollViewer.HorizontalSnapPointsType = SnapPointsType.None;
break;
case :
scrollViewer.HorizontalSnapPointsType = SnapPointsType.Optional;
break;
case :
scrollViewer.HorizontalSnapPointsType = SnapPointsType.Mandatory;
break;
default:
scrollViewer.HorizontalSnapPointsType = SnapPointsType.None;
break;
}
}
} private void btnScroll_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
// 当 BringIntoViewOnFocusChange 为 true 时,如果 txtMsg2 获得焦点,则 ScrollViewer 会自动滚动到 txtMsg2
txtMsg2.Focus(Windows.UI.Xaml.FocusState.Programmatic);
}
}
}

5、演示 ScrollViewer 的 Zoom 特性
Controls/ScrollViewerDemo/Zoom.xaml

<Page
x:Class="Windows10.Controls.ScrollViewerDemo.Zoom"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Controls.ScrollViewerDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <Button Name="bntZoom" Click="bntZoom_Click" Content="放大/缩小到 0.5 倍" Margin="5" /> <!--
Zoom - 放大/缩小 ZoomMode - 是否启用“放大/缩小”功能(Disabled, Enabled),默认值为 Enabled
MaxZoomFactor - 内容放大的最大倍数,默认值 10
MinZoomFactor - 内容放大的最小倍数,默认值 0.1
--> <ScrollViewer Name="scrollViewer" Width="400" Height="400" HorizontalAlignment="Left" Margin="5"
ZoomMode="Enabled" MaxZoomFactor="2" MinZoomFactor="0.5">
<Image Source="/Assets/StoreLogo.png" Width="400" Height="400" />
</ScrollViewer> </StackPanel>
</Grid>
</Page>

Controls/ScrollViewerDemo/Zoom.xaml.cs

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; namespace Windows10.Controls.ScrollViewerDemo
{
public sealed partial class Zoom : Page
{
public Zoom()
{
this.InitializeComponent(); this.Loaded += Zoom_Loaded;
} private void Zoom_Loaded(object sender, RoutedEventArgs e)
{
/*
* ZoomSnapPoints - “放大/缩小”的对齐点的集合,默认是空的
*
* ZoomSnapPointsType - “放大/缩小”的对齐行为
* SnapPointsType.None - 不需要对齐,默认值
* SnapPointsType.Optional - 看情况,如果离某个对齐点很近则对齐
* SnapPointsType.Mandatory - 强制对齐,必须对齐到某一个对齐点
* SnapPointsType.OptionalSingle - 同 Optional,但不能跳过对齐点
* SnapPointsType.MandatorySingle - 同 Mandatory,但不能跳过对齐点
*
* IsZoomChainingEnabled - 是否启用 Zoom 的 Chaining
* IsZoomInertiaEnabled - 是否启用 Zoom 的 Inertia
* ZoomFactor - 获取当前的 Zoom 的倍数
*
* ZoomToFactor() - Zoom 到指定的倍数
*/ scrollViewer.ZoomSnapPointsType = SnapPointsType.OptionalSingle; scrollViewer.ZoomSnapPoints.Add(0.5f);
scrollViewer.ZoomSnapPoints.Add(0.8f);
scrollViewer.ZoomSnapPoints.Add(1.0f);
scrollViewer.ZoomSnapPoints.Add(1.5f);
scrollViewer.ZoomSnapPoints.Add(2.0f);
} private void bntZoom_Click(object sender, RoutedEventArgs e)
{
scrollViewer.ChangeView(null, null, 0.5f);
}
}
}

OK
[源码下载]

背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom的更多相关文章

  1. 重新想象 Windows 8 Store Apps (10) - 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom

    原文:重新想象 Windows 8 Store Apps (10) - 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom [源码下载] ...

  2. 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate

    [源码下载] 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate 作者:webabcd 介绍背水一战 Windows 10 ...

  3. 背水一战 Windows 10 (72) - 控件(控件基类): UIElement - UIElement 的位置, UIElement 的布局, UIElement 的其他特性

    [源码下载] 背水一战 Windows 10 (72) - 控件(控件基类): UIElement - UIElement 的位置, UIElement 的布局, UIElement 的其他特性 作者 ...

  4. 背水一战 Windows 10 (46) - 控件(ScrollViewer 基础): ScrollViewer, ScrollBar, ScrollContentPresenter

    [源码下载] 背水一战 Windows 10 (46) - 控件(ScrollViewer 基础): ScrollViewer, ScrollBar, ScrollContentPresenter 作 ...

  5. 背水一战 Windows 10 (35) - 控件(弹出类): FlyoutBase, Flyout, MenuFlyout

    [源码下载] 背水一战 Windows 10 (35) - 控件(弹出类): FlyoutBase, Flyout, MenuFlyout 作者:webabcd 介绍背水一战 Windows 10 之 ...

  6. 背水一战 Windows 10 (28) - 控件(文本类): TextBox, PasswordBox

    [源码下载] 背水一战 Windows 10 (28) - 控件(文本类): TextBox, PasswordBox 作者:webabcd 介绍背水一战 Windows 10 之 控件(文本类) T ...

  7. 背水一战 Windows 10 (8) - 控件 UI: StateTrigger

    [源码下载] 背水一战 Windows 10 (8) - 控件 UI: StateTrigger 作者:webabcd 介绍背水一战 Windows 10 之 控件 UI VisualState 之 ...

  8. 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI

    [源码下载] 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI 作者:webabcd 介绍背水一战 Wind ...

  9. 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件

    [源码下载] 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件 作者: ...

随机推荐

  1. 【搜索】Dungeon Master

    Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...

  2. canvas 实现赛车游戏

    一:创建画布 <canvas width="200" height="500" id="canvas" style="bor ...

  3. java JNI 实现原理 (二) Linux 下如何 load JNILibrary

    在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是 ...

  4. 747. Largest Number At Least Twice of Others

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  5. 2019.01.23 hdu1964 Pipes(轮廓线dp)

    传送门 题意简述:给一个没有障碍的网格图,任意两个格子连通需要花费一定代价,现在求一条覆盖所有格子的哈密顿回路的总权值的最小值. 思路: 跟这道题一毛一样,除了把求和变成求最小值以外. 代码: #in ...

  6. 2018.11.01 NOIP训练 木棒分组(搜索+剪枝)

    传送门 测试搜索的时候状态定义错了233. 我们把木棒从大到小排序. 然后保证每一组搜到的木棒出现的长度是从大到小递减的. 直接定义现在搜的木棒从什么位置开始,当前这一组的总长度,之前几组的总长度. ...

  7. Spring Boot项目Maven Build报错的解决方法

    问题1, [ERROR]Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0:test (defau ...

  8. java学习2打架代码编写

    在同一个包中的Player类 package work; public class Player { private String name; private int hp; private int ...

  9. arguments[0]()的详解

    var length = 10; function fn(){ console.log(this.length); } var obj = { length:5, method:function(fn ...

  10. 解决Linux下IDEA无法使用ibus输入法的问题和tip乱码

    一:可以先按网上的配置/etc/profile里的输入法的一些参数,我是先配置了这些参数的,但是输入法还是没用,后来一直没管它了,今天用了一些方式可以了但不敢保证不需要先配置那些参数: 二:情况:开启 ...