ScrollViewer
表示可包含其他可视元素的可滚动区域。
ScrollViewer 可使内容在小于其实际大小的区域中显示。 如果 ScrollViewer 的内容不完全可见, ScrollViewer 将显示用户可用于移动可见内容区域的滚动条。范围包含 ScrollViewer 所有内容的区域。 内容的可见区域是viewport。
物理滚动用于按预设的物理增量(通常按以像素为单位声明的值)滚动内容。 逻辑滚动用于滚动到逻辑树中的下一项。 如果需要物理滚动而不是逻辑滚动,请在 ScrollViewer 中包装host Panel element, 并将其 CanContentScroll 属性设置为 false
。 物理滚动是大多数Panel元素的默认滚动行为 。
如果 ScrollViewer 包含大量项目,滚动性能可能会受到影响。 在这种情况下,将设置 IsDeferredScrollingEnabled 为 true
。 这会使内容视图在拖动Thumb 时保持静态,并且仅在 Thumb 释放时才会更新。
由于ScrollViewer元素的滚动条是以该元素的默认样式定义的,因此,如果将自定义样式应用于ScrollViewer,则滚动条将不再显示。 滚动条必须以自定义样式定义才能显示。
自定义 ScrollViewer 控件
若要对多个 ScrollViewer 控件应用相同的属性设置,请使用 Style 属性。 您可以修改ControlTemplate 默认值 ,为控件指定独特的外观。 有关创建ControlTemplate 的详细信息 ,请参阅 通过创建 System.windows.controls.controltemplate> 自定义现有控件的外观。 若要查看特定于 ScrollViewer 的部分和状态,请参阅 ScrollViewer 样式和模板。
此控件的依赖属性可能由控件的默认样式设置。 如果按默认样式设置属性,则当控件出现在应用程序中时,属性可能会更改为默认值。 默认样式取决于应用程序运行时使用的桌面主题。 有关详细信息,请参阅 默认的 WPF 主题。
只有视觉对象属性已存在于控件的默认模板中并且已使用 TemplateBinding 设置时,设置该属性才有效。 在通过创建 ControlTemplate 自定义现有控件的外观一文的更改控件的视觉结构部分可以找到视觉属性列表。
字段
名称 | 备注 | 权限 |
---|---|---|
CanContentScrollProperty | 标识 CanContentScroll 依赖项属性 | public |
ComputedHorizontalScrollBarVisibilityProperty | 标识 ComputedHorizontalScrollBarVisibility 依赖项属性 | public |
ComputedVerticalScrollBarVisibilityProperty | 标识 ComputedVerticalScrollBarVisibility 依赖项属性 | public |
ContentHorizontalOffsetProperty | 标识 ContentHorizontalOffset 依赖项属性 | public |
ContentVerticalOffsetProperty | 标识 ContentVerticalOffset 依赖项属性 | public |
ExtentHeightProperty | 标识 ExtentHeight 依赖项属性 | public |
ExtentWidthProperty | 标识 ExtentWidth 依赖项属性 | public |
HorizontalOffsetProperty | 标识 HorizontalOffset 依赖项属性 | public |
HorizontalScrollBarVisibilityProperty | 标识 HorizontalScrollBarVisibility 依赖项属性 | public |
IsDeferredScrollingEnabledProperty | 标识 IsDeferredScrollingEnabled 依赖项属性 | public |
PanningDecelerationProperty | 标识 PanningDeceleration 依赖项属性 | public |
PanningModeProperty | 标识 PanningMode 依赖项属性 | public |
PanningRatioProperty | 标识 PanningRatio 依赖项属性 | public |
ScrollableHeightProperty | 标识 ScrollableHeight 依赖项属性 | public |
ScrollableWidthProperty | 标识 ScrollableWidth 依赖项属性 | public |
ScrollChangedEvent | 标识 ScrollChanged 路由事件 | public |
VerticalOffsetProperty | 标识 VerticalOffset 依赖项属性 | public |
VerticalScrollBarVisibilityProperty | 标识 VerticalScrollBarVisibility 依赖项属性 | public |
ViewportHeightProperty | 标识 ViewportHeight 依赖项属性 | public |
ViewportWidthProperty | 标识 ViewportWidth 依赖项属性 | public |
属性
名称 | 备注 | 权限 |
---|---|---|
CanContentScroll | 获取或设置一个值,该值指示是否允许滚动支持 IScrollInfo 接口的元素。 | get; set; |
ComputedHorizontalScrollBarVisibility | 获取一个值,该值指示水平 ScrollBar 是否可见。 | get; |
ComputedVerticalScrollBarVisibility | 获取一个值,该值表示垂直 ScrollBar 是否可见。 | get; |
ContentHorizontalOffset | 获取可见内容的水平偏移量。 | get; |
ContentVerticalOffset | 获取可见内容的垂直偏移量。 | get; |
ExtentHeight | 获取包含盘区垂直大小的一个值。 | get; |
ExtentWidth | 获取包含盘区水平大小的值。 | get; |
HandlesScrolling | 获取一个值,该值指示控件的样式中定义有 ScrollViewer,而该样式则定义了自定义键盘滚动行为。 | get; |
HorizontalOffset | 获取一个值,该值包含滚动内容的水平偏移量。 | get; |
HorizontalScrollBarVisibility | 获取或设置一个值,该值指示是否应显示水平 ScrollBar。 | get; set; |
IsDeferredScrollingEnabled | 获取或设置一个值,该值指示当用户拖动 ScrollBar 的 Thumb 时,内容是否为静止状态。 | get; set; |
PanningDeceleration | 获取或设置在 ScrollViewer 惯性中每个单位) 每个单位 (1/96th 每英寸的速率与设备无关的单位速度。 | get; set; |
PanningMode | 获取或设置 ScrollViewer 响应触摸操作的方式。 | get; set; |
PanningRatio | 获取或设置滚动偏移与转换操作偏移的比例。 | get; set; |
ScrollableHeight | 获取一个值,该值表示可滚动的内容元素的垂直大小。 | get; |
ScrollableWidth | 获取一个值,该值表示可滚动的内容元素的水平大小。 | get; |
ScrollInfo | 获取或设置实现 IScrollInfo 接口并提供此 ScrollViewer 的滚动属性值的元素。 | get; set; |
VerticalOffset | 获取包含滚动内容的垂直偏移量的值。 | get; |
VerticalScrollBarVisibility | 获取或设置一个值,该值指示是否应显示垂直 ScrollBar。 | get; set; |
ViewportHeight | 获取包含内容视区垂直大小的值。 | get; |
ViewportWidth | 获取包含内容视区水平大小的值。 | get; |
PanningDeceleration、PanningRatio、PanningMode当用户在支持 Windows touch 的触摸设备上使用到。
方法
名称 | 备注 | 权限 |
---|---|---|
ArrangeOverride | 排列 ScrollViewer 的内容。 | protected |
GetCanContentScroll | 获取给定元素的 CanContentScroll 依赖属性值。 | public |
GetHorizontalScrollBarVisibility | 获取给定元素的 HorizontalScrollBarVisibility 依赖属性值。 | public |
GetIsDeferredScrollingEnabled | 返回指定对象的 IsDeferredScrollingEnabled 属性值。 | public |
GetPanningDeceleration | 返回指定对象的 PanningDeceleration 属性值。 | public |
GetPanningMode | 返回指定对象的 PanningMode 属性值。 | public |
GetPanningRatio | 返回指定对象的 PanningRatio 属性值。 | public |
GetVerticalScrollBarVisibility | 获取给定元素的 VerticalScrollBarVisibility 依赖属性值。 | public |
HitTestCore | 执行命中测试确定指定点是否在此 ScrollViewer 的边界内。 | protected |
InvalidateScrollInfo | 由附加到 ScrollViewer 的 IScrollInfo 接口在任何滚动属性大小的值更改时调用。 滚动属性包括偏移、范围或视区。 | public |
LineDown | 将 ScrollViewer 内容向下滚动一行。 | public |
LineLeft | 将 ScrollViewer 内容向左滚动预先确定的量。 | public |
LineRight | 将 ScrollViewer 内容向右滚动预先确定的量。 | public |
LineUp | 向上滚动一行 ScrollViewer 内容。 | public |
MeasureOverride | 测量 ScrollViewer 元素的内容。 | protected |
OnApplyTemplate | 在内部进程或应用程序调用用于构建当前模板的可视化树的 ApplyTemplate() 时调用。 | public |
OnCreateAutomationPeer | 提供 AutomationPeer 此控件的适当实现,作为 Windows Presentation Foundation (WPF) 自动化基础结构的一部分。 | protected |
OnKeyDown | 响应特定键盘输入,并引发相关滚动行为。 | protected |
OnManipulationCompleted | 在 ManipulationCompleted 事件发生时调用。 | protected |
OnManipulationDelta | 在 ManipulationDelta 事件发生时调用。 | protected |
OnManipulationInertiaStarting | 在 ManipulationInertiaStarting 事件发生时调用。 | protected |
OnManipulationStarting | 在 ManipulationStarting 事件发生时调用。 | protected |
OnMouseLeftButtonDown | 响应鼠标按钮的左键单击操作。 | protected |
OnMouseWheel | 响应鼠标滚轮的单击操作。 | protected |
OnScrollChanged | 当检测到滚动状态发生变化(例如,滚动位置、范围或视区大小发生变化)时调用 | protected |
OnStylusSystemGesture | 当检测到由触笔启动的点击动作时调用。 | protected |
PageDown | 将 ScrollViewer 内容向下滚动一页。 | public |
PageLeft | 将 ScrollViewer 内容向左滚动一页。 | public |
PageRight | 将 ScrollViewer 内容向右滚动一页。 | public |
PageUp | 向上滚动一页 ScrollViewer 内容。 | public |
ScrollToBottom | 垂直滚动到 ScrollViewer 内容的末尾位置。 | public |
ScrollToEnd | 垂直滚动到 ScrollViewer 内容的末尾位置。 | public |
ScrollToHome | 垂直滚动到 ScrollViewer 内容的开始位置。 | public |
ScrollToHorizontalOffset | 将 ScrollViewer 中的内容滚动到指定的水平偏移位置。 | public |
ScrollToLeftEnd | 水平滚动到 ScrollViewer 内容的开始位置。 | public |
ScrollToRightEnd | 水平滚动到 ScrollViewer 内容的末尾位置。 | public |
ScrollToTop | 垂直滚动到 ScrollViewer 内容的开始位置。 | public |
ScrollToVerticalOffset | 将 ScrollViewer 中的内容滚动到指定的垂直偏移位置。 | public |
SetCanContentScroll | 将 CanContentScroll 依赖属性的值设为给定元素。 | public |
SetHorizontalScrollBarVisibility | 将 HorizontalScrollBarVisibility 依赖属性的值设为给定元素。 | public |
SetIsDeferredScrollingEnabled | 为指定对象设置 IsDeferredScrollingEnabled 属性。 | public |
SetPanningDeceleration | 为指定对象设置 PanningDeceleration 属性。 | public |
SetPanningMode | 为指定对象设置 PanningMode 属性。 | public |
SetPanningRatio | 为指定对象设置 PanningRatio 属性。 | public |
SetVerticalScrollBarVisibility | 将 VerticalScrollBarVisibility 依赖属性的值设为给定元素。 | public |
事件
名称 | 备注 |
---|---|
ScrollChanged | 在检测到滚动位置、范围或视区大小的变化时发生。 |
XAML范例
<Window
x:Class="ScrollViewerDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ScrollViewerDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="250"
mc:Ignorable="d" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="SV1"
CanContentScroll="True"
HorizontalScrollBarVisibility="Hidden"
IsDeferredScrollingEnabled="True"
VerticalScrollBarVisibility="Visible"
ScrollChanged="OnScrollChanged" >
<DockPanel Height="1200" LastChildFill="False" >
<Button Height="30" Content="ScrollToBottom" DockPanel.Dock="Top" Click="BtnBottom_OnClick"/>
<Button Height="30" Content="ScrollToTop" DockPanel.Dock="Bottom" Click="BtnTop_OnClick"/>
</DockPanel>
</ScrollViewer>
<StackPanel Grid.Column="1">
<Button Height="30" Content="PageDown" Click="Btn1_OnClick"/>
<Button Height="30" Content="PageUp" Click="Btn2_OnClick" />
<Button Height="30" Content="LineUp" Click="BtnUp_OnClick"/>
<Button Height="30" Content="LineDown" Click="BtnDown_OnClick"/>
<Button Height="30" Content="ScrollToHome" Click="BtnHome_OnClick"/>
<Button Height="30" Content="ScrollToEnd" Click="BtnEnd_OnClick"/>
<Label x:Name="lbl1" Content="0" HorizontalContentAlignment="Center"/>
</StackPanel>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ScrollViewerDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
static int count = 0;
public MainWindow()
{
InitializeComponent();
}
private void Btn1_OnClick(object sender, RoutedEventArgs e)
{
SV1.PageDown();
}
private void Btn2_OnClick(object sender, RoutedEventArgs e)
{
SV1.PageUp();
}
private void BtnUp_OnClick(object sender, RoutedEventArgs e)
{
SV1.LineUp();
}
private void BtnDown_OnClick(object sender, RoutedEventArgs e)
{
SV1.LineDown();
}
private void BtnTop_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToTop();
}
private void BtnBottom_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToBottom();
}
private void BtnHome_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToHome();
}
private void BtnEnd_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToEnd();
}
private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
lbl1.Content = ++count;
}
}
}
C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ScrollViewerDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
static int count = 0;
ScrollViewer SV1 = new ScrollViewer();
Label lbl1 = new Label();
public MainWindow()
{
InitializeComponent();
Grid grid = (this as Window).Content as Grid;
ColumnDefinition column1 = new ColumnDefinition();
ColumnDefinition column2 = new ColumnDefinition();
column1.Width = new GridLength(3, GridUnitType.Star);
column2.Width = new GridLength(1, GridUnitType.Star);
grid.ColumnDefinitions.Add(column1);
grid.ColumnDefinitions.Add(column2);
SV1.CanContentScroll = true;
SV1.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
SV1.IsDeferredScrollingEnabled = true;
SV1.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
SV1.ScrollChanged += OnScrollChanged;
DockPanel dockPanel = new DockPanel();
dockPanel.Height = 1200;
dockPanel.LastChildFill = false;
Button BtnBottom = new Button();
Button BtnTop = new Button();
BtnBottom.Height = 30;
BtnBottom.Content = "ScrollToBottom";
BtnBottom.Click += BtnTop_OnClick;
DockPanel.SetDock(BtnBottom, Dock.Top);
BtnTop.Height = 30;
BtnTop.Content = "BtnTop_OnClick";
BtnTop.Click += BtnBottom_OnClick;
DockPanel.SetDock(BtnTop, Dock.Bottom);
dockPanel.Children.Add(BtnBottom);
dockPanel.Children.Add(BtnTop);
SV1.Content = dockPanel;
StackPanel stackPanel = new StackPanel();
Grid.SetColumn(stackPanel, 1);
Button BtnPageDown = new Button();
Button BtnPageUp = new Button();
Button BtnLineUp = new Button();
Button BtnLineDown = new Button();
Button BtnScrollToHome = new Button();
Button BtnScrollToEnd = new Button();
BtnPageDown.Content = "PageDown";
BtnPageDown.Height = 30;
BtnPageDown.Click += Btn1_OnClick;
BtnPageUp.Content = "PageUp";
BtnPageUp.Height = 30;
BtnPageUp.Click += Btn2_OnClick;
BtnLineUp.Content = "LineUp";
BtnLineUp.Height = 30;
BtnLineUp.Click += BtnUp_OnClick;
BtnLineDown.Content = "LineDown";
BtnLineDown.Height = 30;
BtnLineDown.Click += BtnDown_OnClick;
BtnScrollToHome.Content = "ScrollToHome";
BtnScrollToHome.Height = 30;
BtnScrollToHome.Click += BtnHome_OnClick;
BtnScrollToEnd.Content = "ScrollToEnd";
BtnScrollToEnd.Height = 30;
BtnScrollToEnd.Click += BtnEnd_OnClick;
lbl1.Content = 0;
lbl1.HorizontalContentAlignment = HorizontalAlignment.Center;
stackPanel.Children.Add(BtnPageDown);
stackPanel.Children.Add(BtnPageUp);
stackPanel.Children.Add(BtnLineUp);
stackPanel.Children.Add(BtnLineDown);
stackPanel.Children.Add(BtnScrollToHome);
stackPanel.Children.Add(BtnScrollToEnd);
stackPanel.Children.Add(lbl1);
grid.Children.Add(SV1);
grid.Children.Add(stackPanel);
}
private void Btn1_OnClick(object sender, RoutedEventArgs e)
{
SV1.PageDown();
}
private void Btn2_OnClick(object sender, RoutedEventArgs e)
{
SV1.PageUp();
}
private void BtnUp_OnClick(object sender, RoutedEventArgs e)
{
SV1.LineUp();
}
private void BtnDown_OnClick(object sender, RoutedEventArgs e)
{
SV1.LineDown();
}
private void BtnTop_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToTop();
}
private void BtnBottom_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToBottom();
}
private void BtnHome_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToHome();
}
private void BtnEnd_OnClick(object sender, RoutedEventArgs e)
{
SV1.ScrollToEnd();
}
private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
lbl1.Content = ++count;
}
}
}