WPF基础五:UI②内容元素ScrollViewer

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获取或设置一个值,该值指示是否应显示水平 ScrollBarget; 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获取或设置一个值,该值指示是否应显示垂直 ScrollBarget; 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;
        }
    }
}

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值