热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Windows8Metro应用开发入门(二):MetroApp的几个新控件

http:www.cnblogs.comsolanarchive20120917Win8Metro02.html基于Silverlight开发MetroApp可以使用Silverl

http://www.cnblogs.com/solan/archive/2012/09/17/Win8Metro02.html

基于Silverlight开发Metro App可以使用Silverlight原生的控件,为了更好的开发Metro App,控件库又专门增加了几个新的控件,如:GridView、Flipview、ProgressRing、SemanticZoom和VariableSizedWrapGrid等,这些控件为平板设备提供了良好的触控体验,这一章我们来介绍一下这几个控件的简单用法。

第1节 GridView

GridView是以网格样式展现一组数据,在Web开发中就已经存在,主要用于多行多列的数据显示中。Metro中以分组形式表达数据使用GridView更得心应手,在Silverlight 5及以前版本中,如果想实现分组数据展现要先写一堆数据模板,而在Metro中,这种展现方式得到了增强,GridView 是专门用于分组数据的,如果仅仅是列表数据,则建议使用ListView。

GridView控件有几个非常重要的常用成员:

(1) 数据源

如果是以分组形式展示数据,则数据源必须是可分组的,也即是有主从关系,通常是主列表项中每一项可能存在着某一子列表。GridView的数据源依托于CollectionViewSource,CollectionViewSource有一个属性IsSourceGrouped指明数据源是否是分组源数据集合,还有一个属性ItemsPath指明查找子数据项的路径,通常将可分组的源数据指定给CollectionViewSource对象的Source属性,如下定义了年级与学生的主从关系,年级包含了学生的数据列表:

public class Grade{public Grade(){Students = new ObservableCollection();}public string Name { get; set; }public ObservableCollection Students { get; private set; }}public class Student{public string Name { get; set; }public DateTime Birthday { get; set; }public bool IsClassLeader { get; set; }public string Grade { get; set; }}

以下代码来模拟生成三个年级的学生:

private List CreateGrades(){List Grades &#61; new List();for (int i &#61; 1; i <&#61; 3; i&#43;&#43;){Grade grade &#61; new Grade();grade.Name &#61; "年级 " &#43; i;for (int j &#61; 1; j <&#61; 5; j&#43;&#43;){grade.Students.Add(new Student(){Name &#61; "王学生 " &#43; j,IsClassLeader &#61; true,Birthday &#61; startDate.AddDays(j &#43; 1),Grade &#61; grade.Name});}Grades.Add(grade);}//MyGrades.Source &#61; Grades;return Grades;}

那么&#xff0c;对于这个方法生成的数据源即是可分组的。对于CollectionViewSource&#xff0c;既可以使用静态资源的形式绑定到视图&#xff0c;也可以以后台代码的形式绑定。

&#xff08;2&#xff09;使用GridView展示数据源

a)、项样式

如果要展示个性化的数据视图&#xff0c;需要自定义DataTemplate来规划每组下的每个数据项的布局&#xff0c;如下是对每个学生信息的展示布局&#xff1a;

b)、组样式

也可以对每个分组的展示布局及样式自定义&#xff0c;通过GroupStyle进行设定&#xff0c;如下是对每个年级分组的样式定义&#xff1a;

HidesIfEmpty属性指定当子项为空时是否隐藏组。

HeaderTemplate 定义组头样式。

效果图&#xff1a;

c)、选定项事件

当选定项改变时触发事件SelectionChanged&#xff0c;与Listview、DropDownlist等控件的效果差不多&#xff0c;在事件处理程序中可以做相应处理&#xff0c;如下&#xff1a;

private void GridView_SelectionChanged_1(object sender, SelectionChangedEventArgs e){Student student &#61; ((GridView)sender).SelectedItem as Student;Debug.WriteLine(student.Name);}

以下是完整的示例代码&#xff1a;

XAML&#xff1a;

View Code

C# 绑定数据&#xff1a;

private List CreateGrades(){List Grades &#61; new List();for (int i &#61; 1; i <&#61; 3; i&#43;&#43;){Grade grade &#61; new Grade();grade.Name &#61; "年级 " &#43; i;for (int j &#61; 1; j <&#61; 5; j&#43;&#43;){grade.Students.Add(new Student(){Name &#61; "王学生 " &#43; j,IsClassLeader &#61; true,Birthday &#61; startDate.AddDays(j &#43; 1),Grade &#61; grade.Name});}Grades.Add(grade);}MyGrades.Source &#61; Grades;return Grades;}

在基于横向排列分组时建议使用GridView&#xff0c;在基于纵向排列分组时建议使用ListView&#xff0c;关于ListView的使用请参考相关文档&#xff0c;这里不再介绍。下面给一个ListView的分组效果图&#xff1a;

 

第2节 Flipview

Flipview允许基于“上一页”“下一页”的方式浏览一系列视图&#xff0c;视图可以是图片&#xff0c;也可以是其他的自定义布局。现在很多网站上都有对图片的类似浏览方式&#xff0c;如网易的图片新闻&#xff0c;上一页的导航在整个视图的左侧&#xff0c;下一页的导航在右侧&#xff0c;这种导航非常适合在触摸设备中使用。如下&#xff1a;

Flipview控件来源于ItemsControl&#xff0c;它的使用比较简单&#xff0c;类似于一个容器&#xff0c;只需要往里塞视图即可&#xff0c;至于如何处理上下页的翻转&#xff0c;内部都已经完全实现好了&#xff0c;不仅可以往里面旋转图片&#xff0c;还可以放置其他的视图。如下&#xff1a;

Image可以与Grid共存。Flipview同样有SelectionChanged事件&#xff0c;在事件处理程序中可以获取导航到当前的视图项。

 

第3节 ProgressRing

在Windows 8 中有一个新的进度条&#xff0c;就是几个点围绕一个圆旋转&#xff08;当用户登录到Windows8系统时可以看到&#xff09;。Metro应用程序也提供了这一效果的控件。如下&#xff1a;

它的使用非常的简单&#xff1a;

VerticalAlignment&#61;"Top" Height&#61;"108" Width&#61;"108" IsActive&#61;"True"/>

它有一个很重要的属性IsActive来控制它的活动与休眠。

 

第4节 SemanticZoom

SemanticZoom控件提供了同一个数据源两种视图的展现形式&#xff0c;这是一个很有意思的控件&#xff0c;也可以说一个是近景视图ZoomedInView一个是远景视图ZoomedOutView&#xff0c;我们暂且称它人近景、远景吧。在近景视图中可以浏览每个项的详细信息&#xff0c;远景视图类似预览图&#xff0c;一般是浏览项的简略数据&#xff0c;如下分别是视图ZoomedInView和视图ZoomedOutView&#xff1a;

注意看视图ZoomedInView的右下角有个红圈围起来的一个“一”字按钮&#xff0c;点它可以切换到远景视图&#xff0c;当点击远景视图中的一个项时又切换回近景视图。这通常在快速预览数据列表时很有用&#xff0c;可以向用户隐藏一些不必要的数据。

SemanticZoom有两个非常重要的属性ZoomedInView和ZoomedOutView&#xff0c;当向这两个视图提供布局时该控件才可进行近远景视图的切换。如下&#xff1a;

bool CanChangeViews 指明是否可以进行视图切换

bool IsZoomedInViewActive 指明近景视图ZoomedInView是否为活动视图

在视图切换时会触发两个事件&#xff1a;ViewChangeStarted和ViewChangeCompleted。

代码&#xff1a;

public class SemanticItem{public string Name { get; set; }public DateTime DueDate { get; set; }public bool Complete { get; set; }}private void InitDataSource(){List ds &#61; new List();for (int i &#61; 0; i <20; i&#43;&#43;){ds.Add(new SemanticItem() { Name &#61; "S " &#43; i, DueDate &#61; DateTime.Now, Complete &#61; true });}this.gv1.ItemsSource &#61; this.gv2.ItemsSource &#61; ds;}

如果你想向用户提供两个非常修改化的视图&#xff0c;当然可以发挥你的丰富想象力来实现布局。

 

第5节 VariableSizedWrapGrid

在Silverlight/WPF有一个扩展控件WrapPanel&#xff0c;它是根据自身的宽高和子元素的宽高对子元素进行“换行”排列&#xff0c;当指定子元素横排列优先时&#xff0c;如果横向布局不足容纳全部子元素&#xff0c;则会自动从下一行开始排列&#xff0c;纵向排列优先时类似。Metro应用提供了一个类似的控件VariableSizedWrapGrid&#xff0c;它比WrapPanel有更多的控制&#xff0c;比如&#xff0c;它可以指定子元素的宽和高&#xff0c;还可以指定当前用于布局子元素的行和列数&#xff0c;并且它还能指定某个子元素占用几行或几列&#xff0c;非常强大&#xff01;如下图&#xff1a;

XAML&#xff1a;

VariableSizedWrapGrid有几个非常重要的属性&#xff1a;

double ItemHeight 设置每个子项的高

double ItemWidth 设置每个子项的宽

Orientation Orientation 子元素的排列方向

int MaximumRowsOrColumns获取或设置影响换行点同时说明 Orientation 的值。

DependencyProperty RowSpanProperty 子元素占据的行数&#xff0c;如上图中的白色块。

DependencyProperty ColumnSpanProperty 子元素占据的列数&#xff0c;如上图中的绿色块。

 

小 结

这一章简单介绍了5个控件的常用方法&#xff0c;其实有过Silverlight/WPF经验的都很容易理解&#xff0c;也参考MSDN的相关文档。

本博客文章版权归博客园和solan3000共同所有。

转:https://www.cnblogs.com/gisbeginner/articles/2690060.html



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
YW1232602897663_231
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有