当前位置: 首页 > news >正文

Windows Phone开发(16):样式和控件模板 转:http://blog.csdn.net/tcjiaan/article/details/7367260...

在前面资源一文中也提过样式,样式就如同我们做HTML页排版时常用到的CSS样式表,它是对于特定娄型的可视化元素,应该可以直接说是针对控件的一种可重用的属性设置列表,这样对于需要设置相同属性值的同类型的多个控件来讲是大大提高效率,我们不必要为每个控件做重复的动作。
下面是一个TextBox的样式示例,我们希望通过引用资源中的样式,使得页面上的所有TextBox控件都具有统一的外观,而且都只能输入数字。

[html]  view plain copy print ?
  1. <phone:PhoneApplicationPage.Resources>  
  2.     <!--不带key的样式,应用于所有TextBlock元素-->  
  3.     <Style TargetType="TextBlock">  
  4.         <Setter Property="FontSize" Value="40"/>  
  5.         <Setter Property="Foreground" Value="Yellow"/>  
  6.     </Style>   
  7.     <!--带key的样式,只有引用该资源的元素才应用-->  
  8.     <Style x:Key="MyTextBoxStyle" TargetType="TextBox">  
  9.         <Setter Property="FontSize" Value="40"/>  
  10.         <Setter Property="Foreground" Value="Blue"/>  
  11.         <Setter Property="InputScope">  
  12.             <Setter.Value>  
  13.                 <InputScope>  
  14.                     <InputScopeName NameValue="Number"/>  
  15.                 </InputScope>  
  16.             </Setter.Value>  
  17.         </Setter>  
  18.     </Style>  
  19. </phone:PhoneApplicationPage.Resources>  
  20.     <Grid x:Name="LayoutRoot" Background="Transparent">  
  21.     <Grid.RowDefinitions>  
  22.         <RowDefinition Height="Auto"/>  
  23.         <RowDefinition Height="*"/>  
  24.     </Grid.RowDefinitions>  
  25.   
  26.         <TextBlock Grid.Row="0" x:Name="PageTitle" Text="样式示例" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>  
  27.   
  28.     <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,10,12,0">  
  29.         <Grid.RowDefinitions>  
  30.             <RowDefinition Height="auto"/>  
  31.             <RowDefinition Height="auto"/>  
  32.             <RowDefinition Height="auto"/>  
  33.             <RowDefinition Height="auto"/>  
  34.             <RowDefinition Height="auto"/>  
  35.         </Grid.RowDefinitions>  
  36.         <Grid.ColumnDefinitions>  
  37.             <ColumnDefinition Width="2*"/>  
  38.             <ColumnDefinition Width="3*"/>  
  39.         </Grid.ColumnDefinitions>  
  40.         <TextBlock Grid.Column="0" Grid.Row="0" Text="文本一:"/>  
  41.         <TextBlock Grid.Column="0" Grid.Row="1" Text="文本二:"/>  
  42.         <TextBlock Grid.Column="0" Grid.Row="2" Text="文本三:"/>  
  43.         <TextBlock Grid.Column="0" Grid.Row="3" Text="文本四:"/>  
  44.         <TextBlock Grid.Column="0" Grid.Row="4" Text="文本五:"/>  
  45.           
  46.         <TextBox Grid.Column="1" Grid.Row="0" Style="{StaticResource MyTextBoxStyle}" />  
  47.         <TextBox Grid.Column="1" Grid.Row="1" Style="{StaticResource MyTextBoxStyle}" />  
  48.         <TextBox Grid.Column="1" Grid.Row="2" Style="{StaticResource MyTextBoxStyle}" />  
  49.         <TextBox Grid.Column="1" Grid.Row="3"/>  
  50.         <TextBox Grid.Column="1" Grid.Row="4"/>  
  51.     </Grid>  
  52. </Grid>  


 

样式在资源中有两种声明方式,一种是带键值,一种是不带键值的。
1、带key的样式,不会自动应用到元素/控件上,除非元素的Style属性引用了该资源的键;
2、不带键的样式资源,将自动应用于当前页面(如果资源声明在当前页)中的所有同类型的元素。
所以,在上例中,你会看到左边的一列TextBlock,它们都没有显式设置Style属性,但它们都一致引用了第一个样式,因为该样式是不带键的。
而右面的一列TextBox,由于后面两个没有显式设置Style属性,故它们保持默认样式。

 

 

 

控件模板并不常用,除非你对控件的外观的行为特效有较高的要求,因为我们不能把控的外观弄得太花了,这样反而降低用户体验,简洁明了的东西其实是让人看的最舒服的。
要自定义控件模板,首先要了解一下状态。
如果你以前做过WPF开发你会知道,在.NET 3.5的时候,自定义控件模板,针对控件状态的改变所做出的应对策略是通过触发器来完成的,但到了.NET 4,就有了状态的概念,而Silverlight 3也引入这概念,这样使得控件的状态管理更方便也更灵活了。
还有一点就是状态有分组的,每个组里面的状态是互斥的,也就是不能同时发生,每个时刻只允许组内一个状态发生,但不同组之间的状态是不冲突的。
了解了状态后,还有一概念,就是部件,这个好理解了,比如我们要组装一辆汽车,需要哪些部件,轮胎放哪个位置,车门怎么放置等。对于复杂的控件,有可以有N个控件或UI元素组成,由于WPF是把UI和代码逻辑完全分开的,但有些时候我们也希望与UI元素进行交互,如某UI元素是否透明,是否被移动了,或者模板中的按钮可能要触发其单击事件等,为了方便后台代码能够找到这些部件,所以在控件开发的时候会为这些特定部件统一命名。
那么,怎么知道一个控件的模板中有哪些状态,有哪些特定的部件呢?从控件类的定义所附加的Attribute特性来获取,如,Button控件的状态和部个有:

 

 

[csharp]  view plain copy print ?
  1. // 摘要:  
  2. //     表示按钮控件。  
  3. [TemplateVisualState(Name = "Unfocused", GroupName = "FocusStates")]  
  4. [TemplateVisualState(Name = "Disabled", GroupName = "CommonStates")]  
  5. [TemplateVisualState(Name = "Focused", GroupName = "FocusStates")]  
  6. [TemplateVisualState(Name = "Pressed", GroupName = "CommonStates")]  
  7. [TemplateVisualState(Name = "Normal", GroupName = "CommonStates")]  
  8. [TemplateVisualState(Name = "MouseOver", GroupName = "CommonStates")]  
  9. public class Button : ButtonBase  


 

Button控件是内容控件,它并不复杂,所以没有部件。
下面,我们就以Button为例为它自定义一个模板,注意,定义模板写XAML比较花时间,你可以选择使用设计工具Express Blend来完成,当然了,在学习的时候,最好还是动手写一下。
[html]  view plain copy print ?
  1. <phone:PhoneApplicationPage.Resources>  
  2.     <ControlTemplate x:Key="Template1" TargetType="ButtonBase">  
  3.         <Grid>  
  4.             <!--状态组-->  
  5.             <VisualStateManager.VisualStateGroups>  
  6.                 <VisualStateGroup x:Name="CommonStates">  
  7.                     <VisualState x:Name="Normal"/>  
  8.                     <VisualState x:Name="MouseOver"/>  
  9.                     <VisualState x:Name="Pressed">  
  10.                         <Storyboard>  
  11.                             <DoubleAnimation  
  12.                                 Storyboard.TargetName="pressed"  
  13.                                 Storyboard.TargetProperty="Opacity"  
  14.                                 To="1" Duration="0:0:0.5"/>  
  15.                         </Storyboard>  
  16.                     </VisualState>  
  17.                     <VisualState x:Name="Disabled">  
  18.                         <Storyboard>  
  19.                             <DoubleAnimation  
  20.                                 Storyboard.TargetName="disable"  
  21.                                 Storyboard.TargetProperty="Opacity"  
  22.                                 To="0.5" Duration="0:0:0.5"/>  
  23.                         </Storyboard>  
  24.                     </VisualState>  
  25.                 </VisualStateGroup>  
  26.                 <VisualStateGroup x:Name="FocusStates">  
  27.                     <VisualState x:Name="Focused">  
  28.                         <Storyboard>  
  29.                             <DoubleAnimation  
  30.                                 Storyboard.TargetName="focussbd"  
  31.                                 Storyboard.TargetProperty="Opacity"  
  32.                                 To="0.88"/>  
  33.                         </Storyboard>  
  34.                     </VisualState>  
  35.                 </VisualStateGroup>  
  36.             </VisualStateManager.VisualStateGroups>  
  37.             <Border BorderBrush="{TemplateBinding BorderBrush}"  
  38.                     BorderThickness="{TemplateBinding BorderThickness}">  
  39.                 <Grid x:Name="background" Background="{TemplateBinding Background}">  
  40.                     <Rectangle x:Name="pressed" Opacity="0" RadiusX="2" RadiusY="2">  
  41.                         <Rectangle.Fill>  
  42.                             <LinearGradientBrush  
  43.                                 StartPoint=".5,0"  
  44.                                 EndPoint=".5,1">  
  45.                                 <GradientStop Color="SkyBlue" Offset=".1"/>  
  46.                                 <GradientStop Color="Blue" Offset=".9"/>  
  47.                             </LinearGradientBrush>  
  48.                         </Rectangle.Fill>  
  49.                     </Rectangle>  
  50.                     <ContentPresenter x:Name="ContentPresenter"  
  51.                                       HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"  
  52.                                       VerticalAlignment="{TemplateBinding VerticalContentAlignment}"  
  53.                                       Margin="{TemplateBinding Padding}"  
  54.                                       Content="{TemplateBinding Content}"  
  55.                                       ContentTemplate="{TemplateBinding ContentTemplate}"/>  
  56.                     <Rectangle x:Name="disable" Opacity="0" Fill="Gray" RadiusX="2" RadiusY="2"/>  
  57.                     <Border x:Name="focussbd" BorderBrush="LightGreen" BorderThickness="2" CornerRadius="2" Opacity="0"/>  
  58.   
  59.                 </Grid>  
  60.             </Border>  
  61.         </Grid>  
  62.     </ControlTemplate>  
  63. </phone:PhoneApplicationPage.Resources>  
  64.   
  65.     <Grid x:Name="ContentPanel"  Margin="12,0,12,0">  
  66.         <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="135,155,0,0" Name="button1" VerticalAlignment="Top" Width="160" Template="{StaticResource Template1}" />  
  67.     </Grid>  


控件模板有时候很难一两句话讲清楚,别看它好像很多东西,其实很简单,它无非包括两个东西——状态和UI元素,至于怎么个布局法,完全取决于你希望怎么设计了。

如果你说有什么办法可以帮助学习和研究控件模板,当然有的,前面说了,就是Express Blend这是一个很好用的设计工具,你把它当作图形处理软件也可以,它会根你的设计自动生成XAML,很好用。
Windows Phone SDK带的这个工具是免费的,你在开发的过程中千万不要小气哦,大胆地去用吧,不用钱又这么强大的东东,你不能浪费。

转载于:https://www.cnblogs.com/songtzu/archive/2012/07/24/2607154.html

相关文章:

  • 蓝牙App漏洞系列分析之三CVE-2017-0645
  • SSI框架整合
  • linux 常用命令
  • C语言描述
  • 应用缓存的常见问题及解决
  • 一个简单的例子演示:通过浏览器的滚动条来动态加载数据
  • Code Kata:螺旋矩阵 javascript实现
  • C++容器与算法
  • PostgreSQL在何处处理 sql查询之四十三
  • Tomcat建立多个应用(Web Server),多个主机,多个站点的方法
  • org.tmatesoft.svn.core.SVNCancelException: svn: E200015: authentication canc
  • Linux下查看Tomcat的控制台输出信息
  • 每天一句话
  • Android基础 使用ToolBar教你打造一个通用的标题栏
  • 单点登录配置问题
  • 【个人向】《HTTP图解》阅后小结
  • CentOS 7 防火墙操作
  • CentOS 7 修改主机名
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • DOM的那些事
  • js
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SQLServer之索引简介
  • 关于List、List?、ListObject的区别
  • 基于 Babel 的 npm 包最小化设置
  • 解析带emoji和链接的聊天系统消息
  • 警报:线上事故之CountDownLatch的威力
  • 跨域
  • 前端学习笔记之观察者模式
  • 深入浅出webpack学习(1)--核心概念
  • 试着探索高并发下的系统架构面貌
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 最简单的无缝轮播
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (libusb) usb口自动刷新
  • (ZT)出版业改革:该死的死,该生的生
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (强烈推荐)移动端音视频从零到上手(下)
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET Core Web APi类库如何内嵌运行?
  • .NET命令行(CLI)常用命令
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • //解决validator验证插件多个name相同只验证第一的问题
  • :如何用SQL脚本保存存储过程返回的结果集
  • @JoinTable会自动删除关联表的数据
  • @RequestMapping处理请求异常
  • @Valid和@NotNull字段校验使用
  • [ C++ ] STL_list 使用及其模拟实现
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [android] 手机卫士黑名单功能(ListView优化)