新时尚Windows8开发(25):缩放视图
转自:http://blog.csdn.net/tcjiaan/article/details/8120584
前面有一节,我们探讨了分组视图,本节我们再来吹一下有关缩放视图。那么,这视图怎么个缩放法呢?我们拒绝抽象,直接上截图。
上面两个图中,第一个图就是缩略视图,第二张图片展示的是全视图,所以,这样把图一看,胜于千言万语的理论介绍。
要实现这样的效果,我们有两大工具要引入的。
其中,第一个是看得见的,那就是SemanticZoom,这个东西乍一看可能有点玄,其实它没什么,我们主要把握它的两个属性:
1、ZoomedOutView是缩略视图,即上面图片一。
2、ZoomedInView是放大视图,即上面的图片二。
它们都需要一个实现了ISemanticZoomInformation按口的视图控件,这个我不多说了,你打开对象浏览器,找到ISemanticZoomInformation接口,看看哪些类实现了该接口就明白了。
第二个工具是看不见的,位于Windows.UI.Xaml.Data命名空间下的CollectionViewSource。这个东西用起来不难,但理解起来不容易,建议你深入研究一下,多调试,多断点一下就明白了,一定要充分发挥VS的强大功能,不然就太浪费了。
CollectionViewSource是专为数据绑定有UI视图互动而设的,尤其是对于要实现分组的情况下,更需要它,因为:
Source设置分组后的数据源,至于数居源如何分组,不用我多说了,好好运用一下LinQ吧,别浪费学到的知识。
IsSourceGrouped属性指示是否允许分组,你自己知道怎么设置了。
ItemsPath是分组后,组内部所包含列表的属性路径,参考后面的例子。
View属性就是获取其视图数据,如果是XAML中用{Binding}来绑定,可以忽略它,如果是使用代码的话,记得读取View中的数据。
由于微软隐藏了某些类,也就是不对外公开,而只是公开了接口,并不公开实现接口的具体类,导致这个东西理解起来有些痛苦,但无论在哪里,使用的方法都一样,如果理解不了,我告诉你一个法子,背下来,理解了自然最好。
理论的东西讲再多也是云里雾里,所以我比较倾向于实例,让事实来说话。
新建一个空页面项目,接着打开MainPage.xaml.cs,我们要准备一些用来测试的实体类。
[csharp] view plaincopyprint?
- public class Student
- {
- public string Name { get; set; }
- public string Address { get; set; }
- }
- public class GroupTitleConverter : IValueConverter
- {
- public object Convert(object value, Type targetType, object parameter, string language)
- {
- return string.Format("姓氏:{0}", value);
- }
- public object ConvertBack(object value, Type targetType, object parameter, string language)
- {
- return null;
- }
- }
接着就是XAML代码,MainPage.xaml
[html] view plaincopyprint?
- <Page
- x:Class="App5.MainPage"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:local="using:App5"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d">
- <Page.Resources>
- <local:GroupTitleConverter x:Name="ttcvt"/>
- <Style x:Key="gridvItemStyle" TargetType="GridViewItem">
- <Setter Property="Background" Value="Green"/>
- <Setter Property="VerticalContentAlignment" Value="Bottom"/>
- <Setter Property="HorizontalContentAlignment" Value="Left"/>
- <Setter Property="Margin" Value="10"/>
- </Style>
- </Page.Resources>
- <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
- <SemanticZoom >
- <!-- 外视图 -->
- <SemanticZoom.ZoomedOutView>
- <GridView x:Name="gv" HorizontalAlignment="Center" VerticalAlignment="Center" ItemContainerStyle="{StaticResource gridvItemStyle}">
- <GridView.ItemTemplate>
- <DataTemplate>
- <TextBlock FontSize="24" Text="{Binding Path=Group.Key,Converter={StaticResource ttcvt}}" FontFamily="宋体"/>
- </DataTemplate>
- </GridView.ItemTemplate>
- <GridView.ItemsPanel>
- <ItemsPanelTemplate>
- <WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="3" ItemHeight="80" ItemWidth="160"/>
- </ItemsPanelTemplate>
- </GridView.ItemsPanel>
- </GridView>
- </SemanticZoom.ZoomedOutView>
- <!-- 内视图 -->
- <SemanticZoom.ZoomedInView>
- <ListView x:Name="lvInView" >
- <ListView.GroupStyle>
- <GroupStyle>
- <GroupStyle.HeaderTemplate>
- <DataTemplate>
- <Grid Margin="1,65,0,3" Background="Orange">
- <TextBlock Text="{Binding Key}" FontSize="50" FontWeight="Black" FontFamily="宋体" Margin="5"/>
- </Grid>
- </DataTemplate>
- </GroupStyle.HeaderTemplate>
- <GroupStyle.Panel>
- <ItemsPanelTemplate>
- <VariableSizedWrapGrid Orientation="Horizontal" ItemWidth="225" MaximumRowsOrColumns="3"/>
- </ItemsPanelTemplate>
- </GroupStyle.Panel>
- </GroupStyle>
- </ListView.GroupStyle>
- <ListView.ItemTemplate>
- <DataTemplate>
- <StackPanel>
- <TextBlock FontSize="20" FontWeight="Bold" Text="{Binding Name}" FontFamily="宋体"/>
- <StackPanel Orientation="Horizontal">
- <TextBlock Text="地址:"/>
- <TextBlock Text="{Binding Address}"/>
- </StackPanel>
- </StackPanel>
- </DataTemplate>
- </ListView.ItemTemplate>
- </ListView>
- </SemanticZoom.ZoomedInView>
- </SemanticZoom>
- </Grid>
- </Page>
[csharp] view plaincopyprint?
- // 【C#】
- public MainPage()
- {
- this.InitializeComponent();
- // 随便弄些数据源来测试
- Student[] students = {
- new Student{ Name="孙大敢", Address="rrrrrrrrrrrrrrrrrrrrr"},
- new Student{ Name="李猩猩", Address="eeeeeeeeeeeeeeee"},
- new Student{ Name="金骨头", Address="kkkkkkkkkkkkkk"},
- new Student{ Name="孙大牙", Address="ffffffffffff"},
- new Student{ Name="唐超人", Address="66666666666666"},
- new Student{ Name="李一丁", Address="55555555555555555"},
- new Student{ Name="高今天", Address="777777777777777777777"},
- new Student{ Name="高昨天", Address="eeeeeeeeeeewwww"},
- new Student{ Name="高明天", Address="ppppppppppppppp"},
- new Student{ Name="元三思", Address="ssssssssssssssssss"},
- new Student{ Name="李三山", Address="ssssssssssssss"},
- new Student{ Name="高富帅", Address="ccccccccccccccccccc"},
- new Student{ Name="李XX", Address="eeeeeeeeeeeee"},
- new Student{ Name="唐老鸭", Address="dfeeggggeeeww"},
- new Student{ Name="元小头", Address="zzzzzzzzzzzzzzzzzz"},
- new Student{ Name="元三郎", Address="ddddddddddddddddddd"},
- new Student{ Name="唐小二", Address="hhhhhhhhhhhhhhhhhh"},
- new Student{ Name="元大头", Address="222222222222222"},
- new Student { Name="金刚刀", Address="死胡同"},
- new Student{ Name="曾野人", Address="安哥拉"}
- };
- // 对数据源进行分组
- var res = (from s in students
- group s by s.Name[0].ToString().ToUpper() into g
- select new
- {
- Key = g.Key,
- StudentItems = g.ToList()
- }).ToList<dynamic>();
- // 实例化CollectionViewSource对象
- CollectionViewSource cvs = new CollectionViewSource();
- cvs.IsSourceGrouped = true; //支持分组
- // 分组后集合项的路径,本例中为StudentItems
- cvs.ItemsPath = new PropertyPath( "StudentItems");
- // 设置数据来源,就是我们刚才分好组的动态列表
- cvs.Source = res;
- // 分别对两个视图进行绑定
- this.lvInView.ItemsSource = cvs.View;
- this.gv.ItemsSource = cvs.View.CollectionGroups;
- }
这个我就不解释,WPF学得好的,不是难题。
现在的关键是,如何弄清楚CollectionViewSource的内部结构。
我们在上面的代码后面加上以下代码。
[csharp] view plaincopyprint?
- foreach (var item in cvs.View.CollectionGroups)
- {
- ICollectionViewGroup vg = (ICollectionViewGroup)item;
- dynamic ent = vg.Group as dynamic;
- }
然后下一个断点。
接着运行调试,并单步跟入。
不知道现在明白了没有?反正多动手试一下吧,祝你成功。
因此,我们可以画出这样的结构图。
新时尚Windows8开发(25):缩放视图相关推荐
- 新时尚Windows8开发(21):分组视图
转自:http://blog.csdn.net/tcjiaan/article/details/8069349 有时候,数据的量比较大,有可以我们需要对其进行分组,以方便查看,就像系统的应用程序列表一 ...
- 新时尚Windows8开发(15):扩展联系人选择器
老周的博客http://blog.csdn.net/tcjiaan,转载请注明原作者和出处. 上回我们讨论了如何从联系人选择器中选择联系人记录.但,我们也许会发现一个问题,我们都知道,我们选择的联系人 ...
- 牛仔新时尚-小程序开发案例-数据库篇
今天我将以「牛仔新时尚」小程序为例,服装行业订单小程序从设计到实现的全过程.主要讲产品逻辑搭建和数据库设计的过程.这个小程序的主要功能是向用户展示服装和面料商品,并提供搜索.收藏商品,加入购物车和下单 ...
- 开发 Spring 自定义视图和视图解析器
Spring 视图和视图解析器简介 什么是 Spring 视图和视图解析器 Spring MVC(Model View Controller)是 Spring 中一个重要的组成部分,而 Spring ...
- IOS开发-TableView表视图LV2
在上一章节IOS开发-TableView表视图基础的学习后, 我觉得对于表视图的学习不应只局限于基础知识的学习,应用在实战中的话想要构建丰富的多元化视图界面我想还是必须深入地再学习下. 于是有了这个L ...
- 在线编码工具_每个新编码员都需要25种工具
在线编码工具 by freeCodeCamp 通过freeCodeCamp 每个新编码员都需要25种工具 (25 Tools Every New Coder Needs) 1.现代浏览器 (1. A ...
- 【windows8开发】开发平台与开发框架
开门见山,先把windows8 开发平台和开发框架分享给大家. win8 App开发主要分成两部分,desktop app和metro app.右边蓝色的部分就是desktop app的部 ...
- 【Windows8开发】关于WinRT组件,WinRT dll,Win32 dll,WinRT exe组件的一些尝试
随着Win8的推出,提出了很多新的概念,比如WinRT Component,WinRT dll,WinRT exe component等.基于这些新的概念,进行了很多尝试,本文会把结果分享给大家,希望 ...
- Odoo 12开发之后台视图 – 设计用户界面
Odoo 12开发之后台视图 – 设计用户界面 一·菜单项 # 菜单项形成一个层级结构,最顶层结构 # name 是展示在用户界面中的菜单标题 # action 是点击菜单时运行的窗口 # paren ...
最新文章
- python绘制雷达图-使用Python绘制雷达图
- scanf不可以读空格不可以读string
- oracle 11gR2 RAC root.sh 错误 ORA-15072 ORA-15018
- HDU5670Machine(抽象进制)
- Session.run() Tensor.eval()
- 使用Java泛型和反射机制编写Excel文件生成和解析的通用工具类
- 可视化数据图表制作注意事项
- Node.js验证码模块captchapng
- Unicode字符串和非Unicode字符串
- DFS----深度优先搜索与记忆化数组例题分析
- QQ音乐、网易云音乐、虾米音乐们的音乐社区暗战
- linux内核结构体初始化时出现的.owner = THIS_MODULE
- BootStrap4登录表单验证示例
- 双能CT的基本原理及理解笔记
- JavaScript: 世界上最被误解的语言|Douglas Crockford
- 麦积机器人_天水市一中麦积校区师生在“青少年科技创新大赛暨机器人竞赛”活动中再创佳绩...
- 达内python 培训
- 均值-中位数-众数-极差-中程数-方差-标准差-变异系数
- 炸了!没有任何HTML/CSS ! 纯Python打造一个网站!
- 电源硬件设计----电源组件基本知识
热门文章
- linux 文件映射,Linux-linux如何进行文件映射
- 【可解释论文阅读】13.LRP(Layer-wise relevance propagation相关性分数逐层传播)
- Eclipse: Type Java compiler level does not match the version of the instal解决方法
- 开源云平台Openstack实战部署实习报告
- Python妙用:使用一行代码下载视频
- 实用的网络管理软件-智和网管平台
- node之consolidate模板引擎集成
- Ceph分布式集群安装配置
- 2.5 学费计算(project)
- iphone访问限制密码忘记,怎么办?