Windows Phone 8.1中ScrollViewer(一)

开篇之前:

推荐王磊老师的Windows 8.1关于ScrollViewer的讲解的博客

链接:重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础

ScrollViewer的作用就是当内容超出了设定的范围的时候,出现滚动条用来滚动查看超出的内容

要想在ScrollViewer里面写东西,OK,你可以直接写个<TextBlock>标签,但是当写第二个<TextBlock>的时候就会报

错了,说是多次设置Content值

所以要用布局控件Grid,StackPanel之类的标签直接写

综上,你可以:

<ScrollViewer> <Grid> .......</Grid> </ScrollView>

也可以:

<ScrollViewer> <ScrollViewer.Content> <Grid>.........</Grid> </ScrollViewer.Content> </ScrollViewer>

第一种写法默认就已经添加到Content里面了。Content里面就是ScrollViewer的内容了。

首先,ScrollViewer重要的属性和方法

a.HorizontalScrollMode  和  VerticalScrollMode  属性

用来设置水平和垂直滚动条的行为方式,即是否可以滚动。值有三种选项(Enalbled,Disabled,Auto)

b.HorizontalScrollBarVisibility   和  VerticalScrollBarVisibility  属性

用来设置水平和垂直滚动条是否可见。值为True或者False

c.ViewChanged  方法

表示滚动触发的事件

有了ViewChanged方法,然后我们可以在后台随时监控前台ScrollViewer的行动了

怎么监视呢?如下:ScrollViewer的另一些重要属性

a.ComputedHorizontalScrollBarVisibility   和 ComputedVerticalScrollBarVisibility

判断水平和垂直滚动条的可见性

b.ExtentWidth   和  ExtentHeight

判断ScrollViewer内的内容的宽和高,如我下面代码中设置的宽和高都是500

e.ViewportWidth   和   ViewportHeight

判断可视区的宽和高

f.ScrollableWidth 和  ScrollableHeight

判断可滚动区域的水平和垂直方向的大小,你会发现它的是就是拿(ExtentWidth - ViewportWidth)和

( ExtentHeight - ViewportHeight )的结果。可以从我下面的结果中看到ScrollabelWidth一直是100

g.HorizontalOffset   和  VerticalOffset

判断滚动内容的水平和垂直方向的偏移量,它的范围就是【0,f】,f 就指的是上面 f 代表的值

方法:

我们也可以动态指定ScrollViewer滚动到哪里

Windows 8.1中是用ScrollToHorizontalOffset()和ScrollToVerticalOffset()这两个方法,当然仍然可以在Windows

Phone 8.1中使用,但是方法已经过期了

最新的WP8.1中类似功能的方法是ChangeView()方法,参数就是上面两个值,最后一个是zoomfactor,默认为1即可

好了,理论我就学了这么多,下面直接贴代码了:

这里由于空间有限,我就主要写了水平滚动条的,垂直滚动条跟它是一样一样的

XAML:

<Page
    x:Class="TestUnion.ScrollViewerTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestUnion"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50*"/>
            <RowDefinition Height="50*"/>
        </Grid.RowDefinitions>
        <ScrollViewer x:Name="scrollViewer" IsDeferredScrollingEnabled="True"
                      HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled"
                      HorizontalScrollBarVisibility="Visible"
                      VerticalScrollBarVisibility="Visible"
                      ViewChanged="scrollViewer_ViewChanged">
            <ScrollViewer.Content>
                <StackPanel Height="500" Width="500">
                    <StackPanel.Background>
                        <ImageBrush ImageSource="Assets/3.jpg" />
                    </StackPanel.Background>
                    <TextBox Header="用户名:" />
                    <PasswordBox Header="密码:" />
                    <PasswordBox Header="确认密码:"/>
                    <Button x:Name="btn" Content="滚动到指定的水平或垂直偏移位置(这里选居中)" Click="btn_Click"/>
                </StackPanel>
            </ScrollViewer.Content>
        </ScrollViewer>
        <StackPanel Grid.Row="1" Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <TextBox x:Name="horVisibility" PlaceholderText="判断水平滚动条可见性" Header="ComputedHorizontalScrollBarVisibility" Width="300" Margin="10,10,0,0" />
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <TextBox x:Name="verVisibility" PlaceholderText="判断垂直滚动条可见性" Header="ComputedVerticalScrollBarVisibility" Width="300" Margin="10,10,0,0" />
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <!--这边当然也存在-->
                <!--ExtentHeight-ScrollViewer内的内容的高-->
                <!--ViewportHeight-可视区的高-->
                <TextBox x:Name="extentWidth" PlaceholderText="ScrollViewer内的内容的宽" Header="ExtentWidth" Width="255" Margin="10,10,0,0" />
                <TextBox x:Name="viewportWidth" PlaceholderText="可视区的宽" Header="ViewportWidth " Width="120" Margin="10,10,0,0" />
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <!--这边当然也存在-->
                <!--VerticalOffset-滚动内容的垂直方向的偏移量-->
                <!--ScrollableHeight-可滚动区域的垂直方向的大小-->
                <TextBox x:Name="horizontalOffset" PlaceholderText="滚动内容水平偏移量" Header="HorizontalOffset" Width="195" Margin="10,10,0,0" />
                <TextBox x:Name="scrollableWidth" PlaceholderText="可滚动区域水平大小" Header="ScrollableWidth" Width="195" Margin="10,10,0,0" />
            </StackPanel>
        </StackPanel>
    </Grid>
</Page>

.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkID=390556 上有介绍

namespace TestUnion
{
    /// <summary>
    /// 可用于自身或导航至 Frame 内部的空白页。
    /// </summary>
    public sealed partial class ScrollViewerTest : Page
    {
        public ScrollViewerTest()
        {
            this.InitializeComponent();
        }

        /// <summary>
        /// 在此页将要在 Frame 中显示时进行调用。
        /// </summary>
        /// <param name="e">描述如何访问此页的事件数据。
        /// 此参数通常用于配置页。</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private void scrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
        {
            //ComputedHorizontalScrollBarVisibility - 当前水平滚动条的可见性
            horVisibility.Text = scrollViewer.ComputedHorizontalScrollBarVisibility.ToString();
            //ComputedVerticalScrollBarVisibility - 当前垂直滚动条的可见性
            verVisibility.Text = scrollViewer.ComputedVerticalScrollBarVisibility.ToString();
            //ExtentWidth - ScrollViewer 内的内容的宽
            extentWidth.Text = scrollViewer.ExtentWidth.ToString();
            //ViewportWidth - 可视区的宽
            viewportWidth.Text = scrollViewer.ViewportWidth.ToString();
            //HorizontalOffset - 滚动内容的水平方向的偏移量
            horizontalOffset.Text = scrollViewer.HorizontalOffset.ToString();
            //ScrollableWidth - 可滚动区域的水平方向的大小
            scrollableWidth.Text = scrollViewer.ScrollableWidth.ToString();
        }

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            //让ScrollView里面的内容居中
            scrollViewer.ChangeView(scrollViewer.ScrollableWidth / 2, scrollViewer.ScrollableHeight / 2,1);
            //这边ScrollToHorizontalOffset()和ScrollToVerticalOffset()函数已经过期了(但是仍然是可以用的),现在改用上面的ChangeView()函数
            //ChangeView()函数第一个和第二个参数分别是水平滚动的偏移量和垂直滚动的偏移量,第三个是zoomfactor,默认值是1,好像是关于缩放的,这里设为1就行了
            //scrollViewer.ScrollToHorizontalOffset(scrollViewer.ScrollableWidth / 2);
            //scrollViewer.ScrollToVerticalOffset(scrollViewer.ScrollableHeight / 2);
        }
    }
}

运行截图:

初始:

左滑:

点击按钮让其居中:

时间: 2024-10-29 19:05:48

Windows Phone 8.1中ScrollViewer(一)的相关文章

Windows Phone 8.1中数据显示控件基石------ItemsControl

在Windows Phone 8.1中数据显示交互控件无外乎FlipView,ListView,GridView等,但我们用的时候总不能直接写 <FlipView/>,<ListView/>,<GridView/>之类来使用吧,虽说这样也可以,但这样呈现出来的画面就很难看了,哪 个用户会高兴看呢,反正我是不高兴看. 在这里问题就来了,不光要求数据能绑定到位,功能也到位,界面也总得美化美化吧. 好了进入正题了: 这些数据呈现控件的基石是谁呢?当然是ItemsControl

Windows Phone 8.1中自定义用户控件及如何调用用户控件

对于有些强迫症的我,还是作为程序员,在自己编程的世界里,凡事都要按照自己的意愿来安排布局或者设计动画等 等.虽说微软已经给我们封装了太多太多的控件和模板,但是难免有时候不会符合我们的意愿和要求,在这个时候就 需要我们自己来设计用户自定义控件. 首先需要在VS中创建自定义控件,所以需要在项目名右击->添加->新建项->选择User Control(用户控件)->添加 结合之前一篇提及到的XAML语法和开头的定义的说明,这边借自定义用户控件和引用自定义控件进一步说明. 之前博客中见到X

windows平台在tomcat中启动cas报错解决

windows平台在tomcat中启动cas报错: Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path, 系统找不到指定的路径.] 解决办法:将jansi.dll文件放到C:\Windows\System32目录下即可. 注意:jansi.dll文件在使用gradle编译打包cas时会下载到C:\Users\${用户名}\.gradle

Windows Server 2012 R2中通过IIS实现AD帐号密码修改功能

现在越来越多的企业会对AD帐号进行分类,例如将业务帐号.服务帐号同员工帐号分开管理,那么这类帐号也会因为业务应用特定类型而选择是否开启邮箱功能,再或者有些企业会采用腾讯企业邮箱或网易企业邮箱等等,这些平台本身同AD域是独立的,而且很多企业又使用MAC系统或计算机根本不加域,这时企业内网要搭建OA.WIKI.JIRA等一些需要调用AD中的LDAP让员工登录的系统时,则面临后期密码到期后用户没有入口去修改密码的问题.那么在今天我就要给大家介绍的是如何利用Windows Server 2012 R2中

怎样修复“Windows/System32/Config/System中文件丢失或损坏”故障

怎样修复“Windows/System32/Config/System中文件丢失或损坏”故障 英文原文引自 http://xphelpandsupport.mvps.org/how_do_i_repair_a_missing_or_cor1.htm 此类错误通常说明计算机由于注冊表的原因不能启动,下列操作应该可以修正以上错误.然而,须要特别注意的是,你须要将5个注冊表区域所有进行替换.仅仅简单的替换一个或者两个将会潜在的导致其它的错误 注意 假设你使用的是WindowsXP的OEM版本号,那么你

在Windows控制台应用程序中使用CString

CString是在windows平台下开发中经常使用的字符串类, CString已从MFC中剥离出来了,可以单独使用,只需引用atlstr.h头文件即可. 1 include "stdafx.h" 2 #include <atlstr.h> 3 #include <iostream> 4 5 using namespace std; 6 7 int _tmain(int argc, _TCHAR* argv[]) 8 { 9 //控制台应用程序中使用CStrin

Windows Phone获得IsolatedStorage中指定目录下的所有文件

在Windows Phone 中对隔离存储空间中的文件操作需要通过System.Io.IsolatedStorage下的类进行操作 获得指定文件夹下的所有文件: 参数:是指定文件夹的路径加上通配符,格式:\folder1\* List<string> GetFileNames(string _strFolder) { List<string> returnlst = new List<string>(); using (IsolatedStorageFile stora

windows 进程管理器中的内存是什么意思?

*内存 - 工作集:私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和. *内存 - 峰值工作集:进程所使用的工作集内存的最大数量. *内存 - 工作集增量:进程所使用的工作集内存中的更改量. *内存 - 私人工作集:工作集的子集,它专门描述了某个进程正在使用且无法与其他进程共享的内存数量. *内存 - 提交大小:为某进程使用而保留的虚拟内存的数量. *内存 - 页面缓冲池:由内核或驱动程序代表进程分配的可分页内核内存的数量.可分页内存是可写入其他存储媒体(例如硬盘)的内存

Windows Server 2008 R2中Windows Server Backup功能之备份、恢复

在Windows Server 2008 R2中Windows Server Backup功能只有增量备份和完整备份 默认情况下,Windows Server Backup功能是没有被开启的,需要手动添加此功能. 打开服务器管理>点击功能>右键"添加功能" 选择需要添加的功能,下一步 再点击"安装" 正在安装中--. 提示已经安装成功,点"完成" 安装完成后,在开始菜单>所有程序>管理工具>Windows Serve