样式继承

Style的TargetType提供两种不同的功能:下一节隐式样式中描述了其中一种功能。 另一个函数是为了XAML解析器的好处。 XAML解析器必须能够解析Setter对象中的属性名称,并且为此需要TargetType提供的类名。
样式中的所有属性必须由Target?Type属性中指定的类定义或继承。 设置Style的可视元素的类型必须与TargetType或TargetType的派生类相同。
如果只需要为View定义的属性设置样式,则可以将TargetType设置为View,并仍然使用按钮上的样式或任何其他View派生,如在BasicStyle程序的此修改版本中:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="BasicStyle.BasicStylePage"><ContentPage.Resources><ResourceDictionary><Style x:Key="viewStyle" TargetType="View"><Setter Property="HorizontalOptions" Value="Center" /><Setter Property="VerticalOptions" Value="CenterAndExpand" /><Setter Property="BackgroundColor" Value="Pink" /></Style></ResourceDictionary></ContentPage.Resources><StackLayout><Button Text=" Carpe diem "Style="{StaticResource viewStyle}" /><Label Text ="A bit of text"Style="{StaticResource viewStyle}" /><Button Text=" Sapere aude "Style="{StaticResource viewStyle}" /><Label Text ="Another bit of text"Style="{StaticResource viewStyle}" /><Button Text=" Discere faciendo "Style="{StaticResource viewStyle}" /></StackLayout>
</ContentPage>

如您所见,相同的样式应用于StackLayout的所有Button和Label子项:

但是假设你现在想要扩展这种风格,但对于Button和Label则不同。那可能吗?
是的。样式可以源自其他样式。 Style类包含一个名为BasedOn的属性Style。在代码中,您可以将此BasedOn属性直接设置为另一个Style对象。在XAML中,将BasedOn属性设置为引用先前创建的样式的StaticResource标记扩展。新样式可以包含新属性的Setter对象,或者使用它们覆盖早期样式中的属性。 BasedOn样式必须以新样式TargetType的相同类或祖先类为目标。
这是名为StyleInheritance的项目的XAML文件。该应用程序有两个目的引用Xamarin.FormsBook.Toolkit程序集:它使用HslColor标记扩展来证明标记扩展是Setter对象中的合法值设置,并且可以证明可以为自定义类定义样式,在这种情况下AltLabel。
ResourceDictionary包含四种样式:第一种具有“visualStyle”的字典键。带有“baseStyle”字典键的Style来自“visualStyle”。带有“la?belStyle”和“buttonStyle”键的样式来自“baseStyle”:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:toolkit="clr-namespace:Xamarin.FormsBook.Toolkit;assembly=Xamarin.FormsBook.Toolkit"x:Class="StyleInheritance.StyleInheritancePage"><ContentPage.Resources><ResourceDictionary><Style x:Key="visualStyle" TargetType="VisualElement"><Setter Property="BackgroundColor"Value="{toolkit:HslColor H=0, S=1, L=0.8}" /></Style><Style x:Key="baseStyle" TargetType="View"BasedOn="{StaticResource visualStyle}"><Setter Property="HorizontalOptions" Value="Center" /><Setter Property="VerticalOptions" Value="CenterAndExpand" /></Style><Style x:Key="labelStyle" TargetType="toolkit:AltLabel"BasedOn="{StaticResource baseStyle}"><Setter Property="TextColor" Value="Black" /><Setter Property="PointSize" Value="12" /></Style><Style x:Key="buttonStyle" TargetType="Button"BasedOn="{StaticResource baseStyle}"><Setter Property="TextColor" Value="Blue" /><Setter Property="FontSize" Value="Large" /><Setter Property="BorderColor" Value="Blue" /><Setter Property="BorderWidth" Value="2" /></Style></ResourceDictionary></ContentPage.Resources><ContentPage.Style><StaticResourceExtension Key="visualStyle" /></ContentPage.Style><StackLayout><Button Text=" Carpe diem "Style="{StaticResource buttonStyle}" /><toolkit:AltLabel Text ="A bit of text"Style="{StaticResource labelStyle}" /><Button Text=" Sapere aude "Style="{StaticResource buttonStyle}" /><toolkit:AltLabel Text ="Another bit of text"Style="{StaticResource labelStyle}" /><Button Text=" Discere faciendo "Style="{StaticResource buttonStyle}" /></StackLayout>
</ContentPage>

在参考资源部分之后,立即将页面本身的Style属性设置为“visualStyle”样式:

<ContentPage.Style><StaticResourceExtension Key="visualStyle" />
</ContentPage.Style>

因为Page派生自VisualElement而不是View,所以这是可以应用于页面的资源词典中的唯一样式。 但是,在Re?sources部分之后才能将样式应用于页面,因此使用StaticResource的元素形式是一个很好的解决方案。 页面的整个背景基于此样式着色,并且样式也由所有其他样式继承:
如果AltLabel的样式仅包含Label定义的属性的Setter对象,则TargetType可以是Label而不是AltLabel。但Style具有PointSize属性的Setter。该属性由AltLabel定义,因此TargetType必须是toolkit:AltLabel。
可以为PointSize属性定义Setter,因为PointSize由可绑定属性支持。如果将AltLabel中BindableProperty对象的可访问性从公共更改为私有,则该属性仍可用于AltLabel的许多常规用法,但现在PointSize可以不在样式Setter中设置。 XAML解析器会抱怨它无法找到PointSizeProperty,它是支持PointSize属性的可绑定属性。
您在第10章中发现了StaticResource的工作原理:当XAML解析器遇到StaticResource标记扩展时,它会在可视化树中搜索匹配的字典键。这个过程对风格有影响。您可以在一个“资源”部分中定义样式,然后使用可视树中较低的“资源”部分中具有相同字典键的另一个样式覆盖该样式。将BasedOn属性设置为StaticResource标记扩展时,必须在相同的Resources部分(如StyleInheritance程序中演示)或可视树中较高的Resources部分中定义您派生的样式。
这意味着您可以使用两种分层方式在XAML中构建样式:您可以使用BasedOn从其他样式派生样式,并且可以在可视树中的不同级别定义样式,这些样式派生自可视树中较高的样式或替换它们完全。
对于具有多个页面和大量标记的大型应用程序,定义样式的建议非常简单 - 将样式定义为尽可能接近使用这些样式的元素。
遵循此建议有助于维护程序,并在使用隐式样式时变得特别重要。

第12章 样式(三)相关推荐

  1. 《电机学》第三篇 第10、11、12章 交流旋转电机的共同问题

    第10章 交流旋转电机(同步电机.异步电机)的绕组 电角度 = 极对数p*机械角度 每极每相槽数 = 总槽数/(极对数*相数) 相带 槽距角  = 极对数p * 360°/总槽数 均匀对称原则 电势相 ...

  2. 传智健康 第12章_PDF报表生成_JasperReports

    传智健康项目 第12章_PDF报表生成_JasperReports 文章目录 传智健康项目 第12章_PDF报表生成_JasperReports 1. 常见的PDF报表生成方式_JasperRepor ...

  3. 关于对《Spring Security3》翻译 (第一章 - 第三章)

    原文:http://lengyun3566.iteye.com/category/153689?page=2 翻译说明 最近阅读了<Spring Security3>一书,颇有收获(封面见 ...

  4. Real-time Rendering (3rd edition)学习笔记第1-2章

    本博文仅作学习使用,欢迎学习渲染和计算机图形学的朋友相互讨论. 目录 第1章 介绍 1.1 内容概括 1.2 符号和定义 1.2.1 数学符号 1.2.2 几何定义 进一步阅读和参考资料 第2章 图形 ...

  5. Spring - Java/J2EE Application Framework 应用框架 第 12 章 Web框架

    第 12 章 Web框架 12.1. Web框架介绍 Spring的web框架是围绕分发器(DispatcherServlet)设计的,DispatcherServlet将请求分发到不同的处理器,框架 ...

  6. CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章

    CV:翻译并解读2019<A Survey of the Recent Architectures of Deep Convolutional Neural Networks>第一章~第三 ...

  7. 《面向对象程序设计》第12章在线测试

    <面向对象程序设计>第12章在线测试  <面向对象程序设计>第12章在线测试 剩余时间: 59:55  答题须知:1.本卷满分20分.            2.答完题后,请一 ...

  8. python数据结构题目_《数据结构与算法Python语言描述》习题第二章第三题(python版)...

    ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本 ...

  9. 12-1-顺序文件归并-文件-第12章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第12章  文件 - 顺序文件归并 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源 ...

最新文章

  1. 演示:通过实验取证IP报文的各个字段
  2. 面板——卡片面板、常规折叠面板、手风琴折叠
  3. 30秒无需编码完成一个REST API服务
  4. mysql异步非阻塞方式_如何理解swoole异步非阻塞?
  5. python模块版本管理工具_【转】Python包管理工具
  6. 谜底是计算机的谜语英语,英语谜语(Riddle)  谜底
  7. 5 Java NIO Scatter 与Gather-翻译
  8. 网络安全系列之四十 在Linux中设置SET位权限
  9. map集合和javabean对象之间相互转换方法
  10. 华为大数据平台使用pyhive连接hive的方法(Kerberos验证)
  11. 社招的我,在酷家乐的野蛮生长
  12. 华为路由器配置ip类
  13. wav用matlab打不开,Matlab如何读取wav文件,为什么wavread不行啊
  14. 移动端性能监控方案Hertz
  15. 加来道雄 基因编辑 纳米机器人_同样基因编辑技术,为什么2位学者获得诺奖,中国贺建奎被痛骂?!...
  16. unity lookat导致物体颠倒怎么解决_在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结...
  17. html 常用标签、特殊符号
  18. 模电学习笔记(十一)——微分电路
  19. Unity游戏教程初步(八):Animator的使用
  20. 关于股市里的那些事,学会选股;赢在起跑线

热门文章

  1. 精简自己20%的代码
  2. 高等数学:第十二章 微分方程(1)微分方程的概念,可分离变量的微分方程,齐次方程
  3. Coursera课程Python for everyone:Quiz: REST, JSON, and APIs
  4. 图像处理与计算机视觉:基础,经典以及最近发展(5)计算机视觉
  5. 信息系统项目管理师-案例分析
  6. FTServer 1.1 发布,多语言全文搜索服务器
  7. VS2015 MFC属性页孙鑫笔记
  8. 记一次解决 quill(vue-quill-editor) 编辑器中莫名多出一行“pbr/p”的过程...
  9. PHP中使用ActiveMQ实现消息队列
  10. 注意啦!10 个你需要了解的 Linux 网络和监控命令