首发 手把手教你制作 Windows8 应用程序内部的 hubtile (动态瓷砖控件) MetroStyle(转)

时间:2021-09-19 22:48:30

http://blog.csdn.net/wangrenzhu2011/article/details/8175492 (转)

在metro 风格中 动态磁贴是他的精髓

首发 手把手教你制作 Windows8 应用程序内部的 hubtile (动态瓷砖控件) MetroStyle(转)

在wp7 的开发中 我们可以使用hubtile 来制作类似效果

但是在 win8 中并不具备这个功能,

下面我们来通过扩展GridViewItem 来实现  PictureHubTile

  1. <GridViewItem
  2. x:Class="App1.HubTile"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:App1"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d"
  9. x:Name="gridViewItem"
  10. d:DesignHeight="150"
  11. d:DesignWidth="150">
  12. <GridViewItem.Resources>
  13. <Storyboard x:Name="UpperSecStoryboard">
  14. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="SecImg">
  15. <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="-150" KeySpline="0.29,0.88,0,1"/>
  16. </DoubleAnimationUsingKeyFrames>
  17. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="FirstImg">
  18. <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="150" KeySpline="1,0,1,0"/>
  19. </DoubleAnimationUsingKeyFrames>
  20. </Storyboard>
  21. <Storyboard x:Name="UpperFirstStoryboard">
  22. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="SecImg">
  23. <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="0" KeySpline="1,0,1,0"/>
  24. </DoubleAnimationUsingKeyFrames>
  25. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="FirstImg">
  26. <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="0" KeySpline="0.29,0.88,0,1"/>
  27. </DoubleAnimationUsingKeyFrames>
  28. </Storyboard>
  29. </GridViewItem.Resources>
  30. <Grid Width="{Binding Width, ElementName=gridViewItem}" Height="{Binding Height, ElementName=gridViewItem}">
  31. <Canvas x:Name="PART_LayoutRoot" >
  32. <StackPanel x:Name="PART_Panel">
  33. <Canvas
  34. Height="{Binding Height, ElementName=gridViewItem}"
  35. x:Name="FirstImg">
  36. <Grid  x:Name="PART_FirstContent">
  37. <Image x:Name="Img1"
  38. Width="{Binding Width, ElementName=gridViewItem}"
  39. Height="{Binding Height, ElementName=gridViewItem}"
  40. Stretch="UniformToFill" VerticalAlignment="Center">
  41. </Image>
  42. </Grid>
  43. <Canvas.RenderTransform>
  44. <CompositeTransform/>
  45. </Canvas.RenderTransform>
  46. </Canvas>
  47. <Canvas
  48. x:Name="SecImg"
  49. Height="{Binding Height, ElementName=gridViewItem}">
  50. <Grid x:Name="SecGrid" Background="Red">
  51. <Image x:Name="Img2"
  52. Width="{Binding Width, ElementName=gridViewItem}"
  53. Height="{Binding Height, ElementName=gridViewItem}"
  54. Stretch="UniformToFill" VerticalAlignment="Center">
  55. </Image>
  56. </Grid>
  57. <Canvas.RenderTransform>
  58. <CompositeTransform/>
  59. </Canvas.RenderTransform>
  60. </Canvas>
  61. </StackPanel>
  62. </Canvas>
  63. <ContentPresenter Content="1111" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" x:Name="PART_Title" Margin="0,0,10,7" />
  64. </Grid>
  65. </GridViewItem>
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Linq;
  7. using Windows.Foundation;
  8. using Windows.Foundation.Collections;
  9. using Windows.UI.Xaml;
  10. using Windows.UI.Xaml.Controls;
  11. using Windows.UI.Xaml.Controls.Primitives;
  12. using Windows.UI.Xaml.Data;
  13. using Windows.UI.Xaml.Input;
  14. using Windows.UI.Xaml.Media;
  15. using Windows.UI.Xaml.Media.Animation;
  16. using Windows.UI.Xaml.Media.Imaging;
  17. using Windows.UI.Xaml.Navigation;
  18. using WinRTXamlToolkit.AwaitableUI;
  19. using WinRTXamlToolkit.Imaging;
  20. // “用户控件”项模板在 http://go.microsoft.com/fwlink/?LinkId=234236 上提供
  21. namespace App1
  22. {
  23. public sealed partial class HubTile : GridViewItem
  24. {
  25. #region propdp
  26. #region ImgList
  27. public List<string> ImgList
  28. {
  29. get { return (List<string>)GetValue(ImgListProperty); }
  30. set { SetValue(ImgListProperty, value); }
  31. }
  32. // Using a DependencyProperty as the backing store for ImgList.  This enables animation, styling, binding, etc...
  33. public static readonly DependencyProperty ImgListProperty =
  34. DependencyProperty.Register(
  35. "ImgList",
  36. typeof(List<string>),
  37. typeof(HubTile),
  38. new PropertyMetadata(null, OnImgListChanged));
  39. private static void OnImgListChanged(
  40. DependencyObject d, DependencyPropertyChangedEventArgs e)
  41. {
  42. var target = (HubTile)d;
  43. }
  44. #endregion
  45. #endregion
  46. public HubTile()
  47. {
  48. this.InitializeComponent();
  49. DispatcherTimer timer = new DispatcherTimer();
  50. int index = 0;
  51. bool isFirst = true;
  52. Storyboard storySec = null;
  53. Storyboard storyFir = null;
  54. this.Loaded += ((sender, e) =>
  55. {
  56. storySec = Resources["UpperSecStoryboard"] as Storyboard;
  57. storyFir = Resources["UpperFirstStoryboard"] as Storyboard;
  58. var animation = storySec.Children[0] as DoubleAnimationUsingKeyFrames;
  59. var keyframe = animation.KeyFrames[0] as SplineDoubleKeyFrame;
  60. ((storySec.Children[1] as DoubleAnimationUsingKeyFrames).KeyFrames[0] as SplineDoubleKeyFrame).Value = this.Height;
  61. keyframe.Value = -this.Height;
  62. if (null != ImgList && ImgList.Count > 0)
  63. {
  64. var url = ImgList[0];
  65. BitmapImage _source = new BitmapImage(new Uri(url));
  66. this.Img1.Source = _source;
  67. timer.Start();
  68. }
  69. });
  70. Random r = new Random(Convert.ToInt32(DateTime.Now.Millisecond));
  71. var second = r.Next(2000, 6000);
  72. Debug.WriteLine(this.Name + "间隔时间:" + second);
  73. timer.Interval = TimeSpan.FromMilliseconds(second);
  74. timer.Tick += (async (o, b) =>
  75. {
  76. index++;
  77. var count = ImgList.Count;
  78. if (null != ImgList)
  79. {
  80. var url = ImgList[index % count];
  81. BitmapImage _source = new BitmapImage(new Uri(url));
  82. Debug.WriteLine(this.Name + "加载图片..." + url);
  83. if (isFirst)
  84. {
  85. this.Img2.Source = _source;
  86. isFirst = false;
  87. await storySec.BeginAsync();
  88. Canvas.SetZIndex(SecImg, 1);
  89. Canvas.SetZIndex(FirstImg, 2);
  90. }
  91. else
  92. {
  93. this.Img1.Source = _source;
  94. isFirst = true;
  95. await storyFir.BeginAsync();
  96. Canvas.SetZIndex(SecImg, 2);
  97. Canvas.SetZIndex(FirstImg, 1);
  98. }
  99. }
  100. });
  101. }
  102. }
  103. }

该样例代码中 我使用了awaitUI 来实现对动画执行的监控,

程序逻辑并不复杂,通过随机的timer 来切换图片 实现

开始菜单的效果

demo 稍后上传

最终效果图:

首发 手把手教你制作 Windows8 应用程序内部的 hubtile (动态瓷砖控件) MetroStyle(转)

资源下载地址:http://download.csdn.net/detail/wangrenzhu2011/4760211

样例项目

首发 手把手教你制作 Windows8 应用程序内部的 hubtile (动态瓷砖控件) MetroStyle(转)的更多相关文章

  1. 手把手教你制作微信小程序,开源、免费、快速搞定

    最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...

  2. 手把手教你制作AppPreview视频并上传到appStore进行审核

    手把手教你制作AppPreview视频并上传到appStore进行审核 注意,你需要使用iMovie才能够制作AppPreview视频文件,用QuickTime录制的无效! 最终效果 1. 新建一个事 ...

  3. 手把手教你写Kafka Streams程序

    本文从以下四个方面手把手教你写Kafka Streams程序: 一. 设置Maven项目 二. 编写第一个Streams应用程序:Pipe 三. 编写第二个Streams应用程序:Line Split ...

  4. PWA入门:手把手教你制作一个PWA应用

    摘要: PWA图文教程 原文:PWA入门:手把手教你制作一个PWA应用 作者:MudOnTire Fundebug经授权转载,版权归原作者所有. 简介 Web前端的同学是否想过学习app开发,以弥补自 ...

  5. WPF 程序如何移动焦点到其他控件

    原文:WPF 程序如何移动焦点到其他控件 WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点.本文介绍如何在 ...

  6. C&num; 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls&period;add添加到新的窗体中去

    C# 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls.add添加到新的窗体中去 Form settingForm = new Form(); setForm deviceSet ...

  7. 手把手教你玩微信小程序跳一跳

    最近微信小程序火的半边天都红了,虽然不会写,但是至少也可以仿照网上大神开发外挂吧!下面手把手教妹纸们(汉纸们请自觉的眼观耳听)怎么愉快的在微信小游戏中获得高分. 废话不多说,咱们这就发车了!呸!咱们这 ...

  8. 手把手教你WEB套打程序开发

    WEB套打可选方案不多,理想的更少,利用免费控件Lodop+JavaScript实现精确套打,算是较为经典的选择.这种方案其实比较简单,利用一个htm文件就可以实现模板设计过程,几乎是“空手套”式的开 ...

  9. 教你写一个Android可快速复用的小键盘输入控件

    引子 在Android项目开发中特别是一些稍大型的项目,面对需求文档的时候你经常会发现很多地方用到了同样的组件,但是又略有不同.比如这个: 右边是一个小键盘输入板,左边当焦点不同的时候分别用右边的小键 ...

随机推荐

  1. lua解析赋值类型代码的过程

    我们来看看lua vm在解析下面源码并生成bytecode时的整个过程: foo = "bar" local a, b = "a", "b" ...

  2. PMP 第四章 项目整合管理

    1.什么是整合管理,整合什么?如何整合?    项目整合管理包括识别 定义 组合 统一与协调项目管理过组的个过程及项目管理活动二进行的各种过程和活动.    整合兼具统一 合并 连接和一体化的性质,对 ...

  3. css压缩(一)

    基于require.js的压缩,至于require.js,网上有比较权威的解说 RequireJS进阶(一) RequireJS进阶(二) RequireJS进阶(三) 目前我所做的项目是把各个模块下 ...

  4. 【poj2226】 Muddy Fields

    http://poj.org/problem?id=2226 (题目链接) 题意 给出一个只包含‘.’和‘*’的矩阵,用任意长度的宽为1的木板覆盖所有的‘*’而不覆盖‘.’,木板必须跟矩形的长或宽平行 ...

  5. swift闭包传值

    不知道原理,就知道这么用的,皮毛上的那一点. 寻思着把以前的项目改成swift的,结果了,,, 反向传值 一. //类似于OC中的typedef typealias sendValueClosure= ...

  6. get方式编码问题解决方案 转载

    我们的内容使用GET方式发送,就会在URL后面带上内容,在游览器发来的请求经过了游览器的URI编码,发送到服务器这边,如果是struts2会经过拦截器进行URI解码,并且使用"iso8859 ...

  7. C语言入门(6)——C语言常用数学函数

    在编码过程中会经遇到数学运算,幸运的是C语言提供了非常丰富的数学函数库. 在数学中使用函数有时候书写可以省略括号,而C语言要求一定要加上括号,例如sin(pi/2)这种形式.在C语言的术语中,pi/2 ...

  8. ocp11g培训内部教材&lowbar;053课堂笔记&lpar;043&rpar;&lowbar;数据备份

    053:数据库高级管理: 目录 第一部分:数据库备份与恢复... 4 第一章:备份恢复概述... 4 1.1 备份的意义: 4 1.2 数据库故障的类型:... 4 1.3 制定你的备份和恢复的计划. ...

  9. POI单元格添加公式以及读取公式结果的值

    POI提供了为单元格添加条件样式的方法,但是我并没有找到获取单元格改变后样式的方法,获取到样式依旧是没有改变之前的. 比如为单元格添加条件样式用于监听单元格值是否被修改,如果单元格值被修改那么字体颜色 ...

  10. matlab GUI保存axes(坐标轴)上的图像

    1.默认方式 matlab GUI默认菜单的保存图像默认为保持全部GUI,包括使用" 菜单->编辑->复制图形". 2 保存可见区域 2.1 代码 [FileName, ...