访问静态成员

IMarkupExtension最简单和最有用的实现之一封装在StaticExtension类中。 这是原始XAML规范的一部分,因此它通常出现在带有x前缀的XAML中。 StaticExtension定义了一个名为Member of string的属性,您可以将其设置为公共常量,静态属性,静态字段或枚举成员的类和成员名称。
让我们看看它是如何工作的。 这是一个标签,其中六个属性设置为通常在XAML中显示的属性:

<Label Text="Just some text"BackgroundColor="Accent"TextColor="Black"FontAttributes="Italic"VerticalOptions="Center"HorizontalTextAlignment="Center" />

其中五个属性设置为最终引用各种静态属性,字段和枚举成员的文本字符串,但这些文本字符串的转换通过类型转换器和枚举类型的标准XAML解析进行。
如果您希望更明确地将这些属性设置为各种静态属性,字段和枚举成员,则可以在属性元素标记中使用x:StaticExtension:

<Label Text="Just some text"><Label.BackgroundColor><x:StaticExtension Member="Color.Accent" /></Label.BackgroundColor><Label.TextColor><x:StaticExtension Member="Color.Black" /></Label.TextColor><Label.FontAttributes><x:StaticExtension Member="FontAttributes.Italic" /></Label.FontAttributes><Label.VerticalOptions><x:StaticExtension Member="LayoutOptions.Center" /></Label.VerticalOptions><Label.HorizontalTextAlignment><x:StaticExtension Member="TextAlignment.Center" /></Label.HorizontalTextAlignment>
</Label>

Color.Accent是一个静态属性。 Color.Black和LayoutOptions.Center是静态字段。 FontAttributes.Italic和TextAlignment.Center是枚举成员。
考虑到使用文本字符串设置这些属性的难易程度,使用Stat?icExtension的方法最初看起来很荒谬,但请注意它是一种通用机制。 如果StaticExtension标记的类型与target属性的类型匹配,则可以使用StaticExtension标记中的任何静态属性,字段或枚举成员。
按照惯例,实现IMarkupExtension的类在其名称中包含单词Extension,但您可以将其保留在XAML中,这就是为什么此标记扩展通常称为x:Static而不是x:StaticExtension。 以下标记略微短于前一个块:

<Label Text="Just some text"><Label.BackgroundColor><x:Static Member="Color.Accent" /></Label.BackgroundColor><Label.TextColor><x:Static Member="Color.Black" /></Label.TextColor><Label.FontAttributes><x:Static Member="FontAttributes.Italic" /></Label.FontAttributes><Label.VerticalOptions><x:Static Member="LayoutOptions.Center" /></Label.VerticalOptions><Label.HorizontalTextAlignment><x:Static Member="TextAlignment.Center" /></Label.HorizontalTextAlignment>
</Label>

现在,对于真正重大的主要 - 语法的改变导致属性元素标签消失,占用空间大大缩小。 XAML标记扩展几乎与标记扩展名和一对花括号中的参数一起出现:

<Label Text="Just some text"BackgroundColor="{x:Static Member=Color.Accent}"TextColor="{x:Static Member=Color.Black}"FontAttributes="{x:Static Member=FontAttributes.Italic}"VerticalOptions="{x:Static Member=LayoutOptions.Center}"HorizontalTextAlignment="{x:Static Member=TextAlignment.Center}" />

这种带有花括号的语法无处不在地与XAML标记扩展一起使用,许多开发人员认为标记扩展与大括号语法同义。 这几乎是正确的:虽然花括号总是表示存在XAML标记扩展,但在许多情况下,标记扩展可以在没有花括号的XAML中出现(如前所示),并且有时可以方便地使用它们。
staticExtension类的operty不再是XML属性。 就XML而言,由花括号分隔的整个表达式是属性的值,并且花括号内的参数不带引号。
就像元素一样,标记扩展可以具有ContentProperty属性。 仅具有一个属性的标记扩展(例如具有单个成员属性的StaticExtension类)始终将该唯一属性标记为内容属性。 对于使用卷括号语法的标记扩展,这意味着可以删除成员属性名称和等号:

<Label Text="Just some text"BackgroundColor="{x:Static Color.Accent}"TextColor="{x:Static Color.Black}"FontAttributes="{x:Static FontAttributes.Italic}"VerticalOptions="{x:Static LayoutOptions.Center}"HorizontalTextAlignment="{x:Static TextAlignment.Center}" />

这是x:Static标记扩展的常见形式。
显然,不需要对这些特定属性使用x:Static,但是您可以定义自己的静态成员来实现应用程序范围的常量,并且可以在XAML文件中引用它们。 这在SharedStatics项目中得到了证明。
SharedStatics项目包含一个名为AppConstants的类,它定义了一些可能用于格式化文本的常量和静态字段:

namespace SharedStatics
{static class AppConstants{public static Color LightBackground = Color.Yellow; public static Color DarkForeground = Color.Blue;public static double NormalFontSize = 18;public static double TitleFontSize = 1.4 * NormalFontSize;public static double ParagraphSpacing = 10;public const FontAttributes Emphasis = FontAttributes.Italic;public const FontAttributes TitleAttribute = FontAttributes.Bold;public const TextAlignment TitleAlignment = TextAlignment.Center;}
}

如果每个平台需要不同的东西,可以在这些定义中使用Device.OnPlatform。
然后,XAML文件使用18 x:静态标记扩展来引用这些项。 请注意将本地前缀与项目命名空间相关联的XML名称空间声明:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:SharedStatics"x:Class="SharedStatics.SharedStaticsPage"BackgroundColor="{x:Static local:AppConstants.LightBackground}"><ContentPage.Padding><OnPlatform x:TypeArguments="Thickness"iOS="0, 20, 0, 0" /></ContentPage.Padding><StackLayout Padding="10, 0"Spacing="{x:Static local:AppConstants.ParagraphSpacing}"><Label Text="The SharedStatics Program" TextColor="{x:Static local:AppConstants.DarkForeground}"FontSize="{x:Static local:AppConstants.TitleFontSize}"FontAttributes="{x:Static local:AppConstants.TitleAttribute}"HorizontalTextAlignment="{x:Static local:AppConstants.TitleAlignment}" /><Label TextColor="{x:Static local:AppConstants.DarkForeground}"FontSize="{x:Static local:AppConstants.NormalFontSize}"><Label.FormattedText><FormattedString><Span Text="Through use of the " /><Span Text="x:Static"FontSize="{x:Static local:AppConstants.NormalFontSize}"FontAttributes="{x:Static local:AppConstants.Emphasis}" /><Span Text=
" XAML markup extension, an application can maintain a collection of
common property settings defined as constants, static properties or fields,
or enumeration members in a separate code file. These can then be
referenced within the XAML file." /></FormattedString></Label.FormattedText></Label><Label TextColor="{x:Static local:AppConstants.DarkForeground}"FontSize="{x:Static local:AppConstants.NormalFontSize}"><Label.FormattedText><FormattedString><Span Text=
"However, this is not the only technique to share property settings.
You'll soon discover that you can store objects in a " /><Span Text="ResourceDictionary"FontSize="{x:Static local:AppConstants.NormalFontSize}"FontAttributes="{x:Static local:AppConstants.Emphasis}" /><Span Text=" and access them through the " /><Span Text="StaticResource"FontSize="{x:Static local:AppConstants.NormalFontSize}"FontAttributes="{x:Static local:AppConstants.Emphasis}" /><Span Text=
" markup extension, and even encapsultate multiple property settings in a " /><Span Text="Style"FontSize="{x:Static local:AppConstants.NormalFontSize}"FontAttributes="{x:Static local:AppConstants.Emphasis}" /><Span Text=" object." /></FormattedString></Label.FormattedText></Label> </StackLayout>
</ContentPage>

具有FontAttributes设置的每个Span对象都会重复在Label本身上设置的FontSize设置,因为当应用其他与字体相关的设置时,Span对象不会从Label继承与字体相关的设置。
这是:

此技术允许您在多个页面上使用这些公共属性设置,如果您需要更改值,则只需更改AppSettings文件。
也可以使用x:Static和静态属性以及在外部li?braries中的类中定义的字段。 下面的示例名为SystemStatics,它设计得非常合适 - 它将Button的BorderWidth设置为等于Math类中定义的PI静态字段,并使用静态Environment.New?Line属性来处理文本中的换行符。 但它证明了这项技术。
Math和Environment类都在.NET System命名空间中定义,因此需要新的XML命名空间声明来定义名为(例如)sys for System的前缀。 请注意,此命名空间声明将CLR命名空间指定为System,但将程序集指定为mscorlib,它最初代表Microsoft公共对象运行时库,但现在代表多语言标准公共对象运行时库:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:sys="clr-namespace:System;assembly=mscorlib"x:Class="SystemStatics.SystemStaticsPage"><StackLayout><Button Text=" Button with π border width "BorderWidth="{x:Static sys:Math.PI}"HorizontalOptions="Center"VerticalOptions="CenterAndExpand"><Button.BackgroundColor><OnPlatform x:TypeArguments="Color"Android="#404040" /></Button.BackgroundColor> <Button.BorderColor><OnPlatform x:TypeArguments="Color"Android="White"WinPhone="Black" /></Button.BorderColor></Button><Label VerticalOptions="CenterAndExpand"HorizontalTextAlignment="Center"FontSize="Medium"><Label.FormattedText><FormattedString><Span Text="Three lines of text" /><Span Text="{x:Static sys:Environment.NewLine}" /><Span Text="separated by" /><Span Text="{x:Static sys:Environment.NewLine}" /><Span Text="Environment.NewLine"FontSize="Medium"FontAttributes="Italic" /><Span Text=" strings" /></FormattedString></Label.FormattedText></Label></StackLayout>
</ContentPage>

除非设置了背景颜色,否则按钮边框不会显示在Android中,并且在An?droid和Windows Phone上边框都需要非默认颜色,因此一些额外的标记可以解决这些问题。 在iOS平台上,按钮边框往往会挤压按钮文本,因此文本在开头和结尾都定义了空格。
仅从视觉效果来判断,我们必须相信按钮边框宽度约为3.14单位宽,但断线肯定有效:

使用花括号进行标记扩展意味着您无法显示由花括号括起来的文本。 本文中的花括号将被误认为是标记扩展名:

<Label Text="{Text in curly braces}" />

那不行。 您可以在文本字符串中的其他位置使用花括号,但不能以左大括号开头。
但是,如果确实需要,可以通过使用由左右一对花括号组成的转义序列开始文本,确保文本不会被误认为是XAML标记扩展:

<Label Text="{}{Text in curly braces}" />

这将显示您想要的文本。

第十章:XAML标记扩展(二)相关推荐

  1. 第十章:XAML标记扩展(三)

    资源词典 Xamarin.Forms还支持第二种共享对象和值的方法,虽然这种方法比x:静态标记扩展稍微有点开销,但它更通用 - 因为所有东西 - 共享对象和使用的可视元素 它们 - 可以用XAML表示 ...

  2. WPF - 自定义标记扩展

    在使用WPF进行编程的过程中,我们常常需要使用XAML的标记扩展:{Binding},{x:Null}等等.那么为什么WPF提供了XAML标记扩展这一功能,我们又如何创建自定义的标记扩展呢.这就是本文 ...

  3. wpf中xaml的类型转换器与标记扩展

    wpf中xaml的类型转换器与标记扩展 原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是 ...

  4. [No0000130]WPF 4.5使用标记扩展订阅事件

    自从我上次写到关于标记扩展的时候已经有一段时间了...... Visual Studio 11 Developer Preview的发布给WPF带来了一些新功能,让我有理由再次使用它们.我要在这里讨论 ...

  5. X命名空间-标记扩展

    标记扩展一般含有 {} 符号 x:Type 传入操作数据类型 x:Null 空值 通过例子看下具体: (前台XAML代码) <Window x:Class="WpfApplicatio ...

  6. 2.6 wpf标记扩展

    1.什么是标记扩展?为什么要有标记扩展? 标记扩展是扩展xmal的表达能力 为了克服现存的类型转换机制存在的 常用的标记扩展有如下: x:Array 代表一个.net数组,它的子元素都是数组元素.它必 ...

  7. WPF学习:4.类型转换和标记扩展

    在上一章,主要介绍了Border和Brush,这一章主要介绍下类型转换和标记扩展.相关代码链接如下: http://files.cnblogs.com/keylei203/4.WPFSampleDem ...

  8. 实战-Ueditor扩展二次开发

    第一部分 开发前期准备  1.UEditor从1.4.1开始,添加对于二次开发的扩展支持. Jeewx扩展二次开发采用1.4.3.1 Jsp 版本 2.上传图片设置 简述: UE做的不够灵活,不如老版 ...

  9. WP模板Ripro9.0免扩展二开版+全解密无后门

    正文: RiPro9.0免扩展二开版,RiPro主题全解密无后门,这次分享的源码包内的东西不少 不仅含有RiPro主题.子主题,还有几款插件,都是非常实用的东西!下面我将逐一介绍一下. 1.ripro ...

最新文章

  1. Android --- RecyclerView 水平滑动时,一个 item 一个 item 的滑动,禁止滑动到一半停止
  2. 域控限制软件安装_谷歌调整Android Q安装第三方APP策略,每次都需要手动解除限制...
  3. 王道计算机考研 数据结构 (图-上)
  4. Spring-JDBC通用Dao
  5. 单例模式---设计模式
  6. 查找空目录Linux,Linux中find批量删除空文件及空文件夹脚本
  7. mysql执行计划性能_MySQL SQL性能分析Explain执行计划
  8. 云智视像 | 内推两个年薪可达70万+的CV算法职位~base杭州上海
  9. java c s 比 c c s_Java技术学习笔记:C/S 与B/S 区别
  10. dom兼容性问题3 元素操作
  11. TagSL框架设计(1)----先来点简介
  12. 七天学完Vue之第三天学习笔记(组件的应用操作以及插槽的使用)
  13. 怎样带团队,带好团队
  14. ssh: connect to host master port 22: No route to host
  15. LeetCode题解(1564):把箱子放进仓库里I(Python)
  16. 动手试试!手把手教你如何适配 iPhone X
  17. 认知理论中的首因效应、刻板效应、近因效应、晕轮效应效应
  18. 【论文解读】从可扩展的远程情感监督构建的附有结构和主次标记的MEGA RST 篇章树库
  19. 74hc165并行口转串口芯片学习
  20. 假如我国国民生产总值的年增长率为7%,计算10年后我国的国民生产总值与现在相比增长多少百分比。

热门文章

  1. CentOS 常用命令
  2. 人脸识别已OUT?猫脸识别才更酷!|在线课堂
  3. python安装多久_(一)安装Python
  4. vue 获取数组索引_vue 重塑数组之修改数组指定index的值操作
  5. python中的scale_Python Matplotlib.pyplot.yscale()用法及代码示例
  6. pandas如何通过函数修改某一列的值?
  7. 解决SQLServer占用80端口问题
  8. echarts vue 柱状图实例_「源码学习」适用于 Vue3 的 ECharts 包装组件
  9. java double的加法_java Double 进行加减乘除
  10. python集合类型中的元素是有序的_python基础篇:很有意思的数据类型,集合(set) 常用去去重...