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

  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. <TextBlock Grid.Row="0" x:Name="PageTitle" Text="样式示例" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
  26. <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,10,12,0">
  27. <Grid.RowDefinitions>
  28. <RowDefinition Height="auto"/>
  29. <RowDefinition Height="auto"/>
  30. <RowDefinition Height="auto"/>
  31. <RowDefinition Height="auto"/>
  32. <RowDefinition Height="auto"/>
  33. </Grid.RowDefinitions>
  34. <Grid.ColumnDefinitions>
  35. <ColumnDefinition Width="2*"/>
  36. <ColumnDefinition Width="3*"/>
  37. </Grid.ColumnDefinitions>
  38. <TextBlock Grid.Column="0" Grid.Row="0" Text="文本一:"/>
  39. <TextBlock Grid.Column="0" Grid.Row="1" Text="文本二:"/>
  40. <TextBlock Grid.Column="0" Grid.Row="2" Text="文本三:"/>
  41. <TextBlock Grid.Column="0" Grid.Row="3" Text="文本四:"/>
  42. <TextBlock Grid.Column="0" Grid.Row="4" Text="文本五:"/>
  43. <TextBox Grid.Column="1" Grid.Row="0" Style="{StaticResource MyTextBoxStyle}" />
  44. <TextBox Grid.Column="1" Grid.Row="1" Style="{StaticResource MyTextBoxStyle}" />
  45. <TextBox Grid.Column="1" Grid.Row="2" Style="{StaticResource MyTextBoxStyle}" />
  46. <TextBox Grid.Column="1" Grid.Row="3"/>
  47. <TextBox Grid.Column="1" Grid.Row="4"/>
  48. </Grid>
  49. </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控件的状态和部个有:
  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来完成,当然了,在学习的时候,最好还是动手写一下。
  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. </Grid>
  59. </Border>
  60. </Grid>
  61. </ControlTemplate>
  62. </phone:PhoneApplicationPage.Resources>
  63. <Grid x:Name="ContentPanel"  Margin="12,0,12,0">
  64. <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="135,155,0,0" Name="button1" VerticalAlignment="Top" Width="160" Template="{StaticResource Template1}" />
  65. </Grid>

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

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

转载于:https://www.cnblogs.com/xieweikai/p/6833153.html

Windows Phone开发(16):样式和控件模板相关推荐

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

    在前面资源一文中也提过样式,样式就如同我们做HTML页排版时常用到的CSS样式表,它是对于特定娄型的可视化元素,应该可以直接说是针对控件的一种可重用的属性设置列表,这样对于需要设置相同属性值的同类型的 ...

  2. Silverlight 属性样式、控件模板、视觉状态

    在使用Silverlight的样式的时候感觉非常好,以前在HTML上很难实现的效果在这里都变的如此简单. 属性样式 控件的属性样式好比CSS的Class功能定义,是用来统一定义和维护控件属性的方式,控 ...

  3. Windows App开发之经常使用控件与应用栏

    控件的属性.事件与样式资源 怎样加入控件 加入控件的方式有多种,大家更喜欢以下哪一种呢? 1)使用诸如Blend for Visual Studio或Microsoft Visual Studio X ...

  4. 【飞秋】一起学Windows Phone7开发(十三.四 基本控件)

    在这里,把一些最基本的控件列出来,其实也就是没有归类的控件都放在这里了. 一.TextBlock:这个控件其实就是Label控件. <TextBlock x:Name="PageTit ...

  5. 【飞秋】一起学Windows Phone7开发(十三.二 按钮控件)

    在Silverlight中有多种按钮控件,这些控件在Windows phone7中也都得到了很好的支持. 一.Button: 这个控件只是一个基础控件,通过blend可以创建出多种效果的按钮来. &l ...

  6. 一起学Windows Phone7开发(十三.三 输入控件)

    在Phone7中主要的输入控件其实就有两个,一个是textbox,另一个就是password控件.这两个控件中尤其是TextBox控件有了很多新特性. 一.PasswordBox:   密码框控件,用 ...

  7. windows常见窗口样式和控件风格以及类样式

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...

  8. Windows常见窗口样式和控件风格

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...

  9. 快速构建Windows 8风格应用6-GridView数据控件

    原文:快速构建Windows 8风格应用6-GridView数据控件 本篇博文主要介绍什么是GridView数据控件.如何构建常用的GridView数据呈现样式. 什么是GridView数据控件? G ...

最新文章

  1. matlab inviter,水中石
  2. python实现新闻网站_如何用 100 行 Python 代码实现新闻爬虫?这样可算成功?
  3. python socket 书籍_Python学习之路——socket
  4. PAT (Advanced Level) 1004 Counting Leaves(树的遍历)
  5. if match header test - 428 Precondition required
  6. 如果编程语言是女孩子
  7. 4.Dynamics CRM 数据数量限制更改
  8. 第5 章持久化类(Persistent Classes)
  9. Android上传文件至服务器
  10. 用laravel dingo api插件库创建api的一些心得笔记
  11. 深入理解 GraphQL
  12. AD16原理图页设置库路径(1)
  13. Python-常用模块有哪些
  14. 空间数据挖掘与空间大数据的探索与思考(三)
  15. python残差分析图
  16. springboot结合注解动态获取数据库表
  17. 【旧资料整理】8086汇编 鼠标操作
  18. html如何设定盒子的高,css 高度height设置
  19. 02.windows转mac日记——操作习惯
  20. 循环冗余校验码例题[转帖]

热门文章

  1. 2022-2028年中国锂电池用聚烯烃隔膜行业市场发展调研及投资方向分析报告
  2. 2022-2028年中国氢化丁晴橡胶行业市场研究及前瞻分析报告
  3. 科大奥锐干涉法测微小量实验的数据_光学干涉观测精确丈量宇宙 | 赛先生天文...
  4. Python 标准库之 Queue
  5. 用python实现杨辉三角的几种不同方式
  6. debian10 简单搭建squid
  7. 命名实体识别入门教程(必看)
  8. CUDA 11功能清单
  9. 在C++中加载TorchScript模型
  10. DeepLabV3+语义分割实战