Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6541638
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Android平台

2018-07-30 21:30:59

较少使用的标记扩展

三个标记扩展名的使用量与其他扩展名不同。 这些是:

  • x:Null
  • x:Type
  • x:Array
    您使用x:Null扩展名将属性设置为null。 语法如下所示:

点击(此处)折叠或打开

  1. <SomeElement SomeProperty="{x:Null}" />
这没有多大意义,除非SomeProperty的默认值不为null,因为它可以将属性设置为null。 但正如您将在第12章中看到的,有时属性可以从样式中获取非null值,而x:Null几乎是覆盖它的唯一方法。
x:Type标记扩展用于设置Type类型的属性,.NET类描述类或结构的类型。 这是语法:

点击(此处)折叠或打开

  1. <AnotherElement TypeProperty="{x:Type Color}" />
您还将使用x:与x:Array连接。 x:Array标记扩展始终使用常规元素语法而不是大括号语法。 它有一个名为Type的必需参数,您可以使用x:Type标记扩展名进行设置。 这表示数组中元素的类型。这是如何在资源字典中定义数组:

点击(此处)折叠或打开

  1. <x:Array x:Key="array"
  2.          Type="{x:Type x:String}">
  3.     <x:String>One String</x:String>
  4.     <x:String>Two String</x:String>
  5.     <x:String>Red String</x:String>
  6.     <x:String>Blue String</x:String>
  7. </x:Array>

自定义标记扩展

让我们创建一个名为HslColorExtension的标记扩展。 这将允许我们通过指定色调,饱和度和亮度的值来设置Color类型的任何属性,但是比使用第8章“代码和XAML协调”中演示的x:FactoryMethod标记简单得多。
此外,让我们将这个类放在一个单独的可移植类库中,以便您可以从多个应用程序中使用它。 可以在本书的其他源代码中找到这样的库。 它位于名为Libraries的目录中,与单独的章节目录并行。 此PCL的名称(以及其中的类的名称空间)是Xamarin.FormsBook.Toolkit。
您可以在自己的应用程序中自行使用此库,方法是添加对它的引用。 然后,您可以在XAML文件中添加新的XML命名空间声明,以便指定此库:

点击(此处)折叠或打开

  1. xmlns:toolkit="clr-namespace:Xamarin.FormsBook.Toolkit;assembly=Xamarin.FormsBook.Toolkit"
使用此工具包前缀,您可以像使用其他XAML标记扩展一样引用HslColorExtension类:

点击(此处)折叠或打开

  1. <BoxView Color="{toolkit:HslColor H=0.67, S=1, L=0.5}" />
与目前为止显示的其他XAML标记扩展不同,此扩展具有多个属性,如果您将它们设置为带有大括号语法的参数,则必须用逗号分隔它们。
这样的东西会有用吗? 让我们首先看看如何为要在应用程序之间共享的类创建这样的库:
在Visual Studio中,从“文件”菜单中选择“新建”和“项目”。 在New Project对话框中,选择左侧的Visual C#和Cross-Platform,以及列表中的Class Library(Xamarin.Forms)。 找到项目的位置并为其命名。 对于为此示例创建的PCL,名称为Xamarin.FormsBook.Toolkit。 单击确定。 除了项目的所有开销外,模板还创建了一个名为Xamarin.FormsBook.Toolkit.cs的代码文件,其中包含一个名为Xamarin.Forms?Book.Toolkit的类。 那不是有效的类名,所以只需删除该文件即可。
在Xamarin Studio中,从“文件”菜单中选择“新建”和“解决方案”。 在“新建项目”对话框中,选择左侧的“多平台和库”,然后从列表中选择“表单和类库”。 找到它的位置并为其命名(本例中为Xamarin.FormsBook.Toolkit)。 单击确定。 解决方案模板创建多个文件,包括名为MyPage.cs的文件。 删除该文件。
您现在可以以正常方式向此项目添加类:
在Visual Studio中,右键单击项目名称,选择“添加”和“新建项”。 在Add New Item dialog中,如果您只是创建一个仅代码类,请在左侧选择Visual C#和Code,然后从列表中选择Class。 给它一个名字(本例中为HslColorExtension.cs)。 单击“添加”按钮。
在Xamarin Studio中,在项目的工具菜单中,选择“添加”和“新建文件”。 在New File dia?log中,如果您只是创建一个仅代码类,请选择左侧的General和列表中的Empty Class。 给它一个名字(本例中为HslColorExtension.cs)。 单击“新建”按钮。
在本书的过程中,将构建Xamarin.FormsBook.Toolkit库并积累有用的类。 但是这个库中的第一个类是HslColorExtension。 HslColorExtension.cs文件(包括所需的using指令)如下所示:

点击(此处)折叠或打开

  1. using System;
  2. using Xamarin.Forms;
  3. using Xamarin.Forms.Xaml;
  4. namespace Xamarin.FormsBook.Toolkit
  5. {
  6.     public class HslColorExtension : IMarkupExtension
  7.     {
  8.         public HslColorExtension()
  9.         {
  10.             A = 1;
  11.         }
  12.         public double H { set; get; }
  13.         public double S { set; get; }
  14.         public double L { set; get; }
  15.         public double A { set; get; }
  16.         public object ProvideValue(IServiceProvider serviceProvider)
  17.         {
  18.             return Color.FromHsla(H, S, L, A);
  19.         }
  20.     }
  21. }

请注意,该类是公共的,因此它可以从库外部看到,并且它实现了IMarkupExtension接口,这意味着它必须包含ProvideValue方法。 但是,该方法根本不使用IServiceProvider参数,主要是因为它不需要知道自身外部的任何其他内容。 它需要的只是创建Color值的四个属性,如果未设置A值,则使用默认值1(完全不透明)。
这个Xamarin.FormsBook.Toolkit解决方案只包含一个PCL项目。 可以构建项目以生成PCL程序集,但如果没有使用此程序集的应用程序,则无法运行该项目。
从应用程序解决方案访问此库有两种方法:

  • 从应用程序解决方案的PCL项目中,添加对库PCL程序集的引用,该库是从库项目生成的动态链接库(DLL)。
  • 从应用程序解决方案中包含指向库项目的链接,并从应用程序的PCL项目添加对该库项目的引用。

如果您只有DLL而不是包含源代码的项目,则第一个选项是必需的。也许您正在许可库并且无法访问源。但是,如果您有权访问该项目,通常最好在解决方案中包含指向库项目的链接,以便您可以轻松地更改库代码并重建库项目。
本章的最后一个项目是CustomExtensionDemo,它使用新库中的HslColorExtension类。 CustomExtensionDemo解决方案包含指向Xamarin.FormsBook.Toolkit PCL项目的链接,CustomExtensionDemo专业版中的References部分列出了Xamarin.FormsBook.Toolkit程序集。
现在,应用程序项目似乎已准备好访问库项目,以便在应用程序的XAML文件中使用HslColorExtension类。
但首先是另一步。除非您已启用XAML编译,否则从XAML引用外部库不足以确保该库包含在应用程序中。需要从实际代码访问库。出于这个原因,Xamarin.FormsBook.Toolkit还包含一个类和方法,可能从名称中看起来正在为library执行重要的初始化:

点击(此处)折叠或打开

  1. namespace Xamarin.FormsBook.Toolkit
  2. {
  3.     public static class Toolkit
  4.     {
  5.         public static void Init()
  6.         {
  7.         }
  8.     }
  9. }
每当你使用这个库中的任何东西时,试着养成在App文件中首先调用这个Init方法的习惯:

点击(此处)折叠或打开

  1. namespace CustomExtensionDemo
  2. {
  3.     public class App : Application
  4.     {
  5.         public App()
  6.         {
  7.             Xamarin.FormsBook.Toolkit.Toolkit.Init();
  8.             MainPage = new CustomExtensionDemoPage();
  9.         }
  10.     ...
  11.     }
  12. }
以下XAML文件显示Xamarin.Forms?Book.Toolkit库的XML名称空间声明以及访问自定义XAML标记扩展的三种方法 - 使用在Color属性上使用property-element语法设置的HslColorExtension元素并使用两个HslColorExtension 和HslColor使用更常见的大括号语法。 再次注意使用逗号分隔花括号内的参数:

点击(此处)折叠或打开

  1. <ContentPage xmlns=""
  2.              xmlns:x=""
  3.              xmlns:toolkit=
  4.  "clr-namespace:Xamarin.FormsBook.Toolkit;assembly=Xamarin.FormsBook.Toolkit"
  5.              x:Class="CustomExtensionDemo.CustomExtensionDemoPage">
  6.     <StackLayout>
  7.         <!-- Red -->
  8.         <BoxView HorizontalOptions="Center"
  9.                  VerticalOptions="CenterAndExpand">
  10.             <BoxView.Color>
  11.                 <toolkit:HslColorExtension H="0" S="1" L="0.5" />
  12.             </BoxView.Color>
  13.         </BoxView>
  14.  
  15.         <!-- Green -->
  16.         <BoxView HorizontalOptions="Center"
  17.                  VerticalOptions="CenterAndExpand">
  18.             <BoxView.Color>
  19.                 <toolkit:HslColorExtension H="0.33" S="1" L="0.5" />
  20.             </BoxView.Color>
  21.         </BoxView>
  22.  
  23.         <!-- Blue -->
  24.         <BoxView Color="{toolkit:HslColor H=0.67, S=1, L=0.5}"
  25.                  HorizontalOptions="Center"
  26.                  VerticalOptions="CenterAndExpand" />
  27.  
  28.         <!-- Gray -->
  29.         <BoxView Color="{toolkit:HslColor H=0, S=0, L=0.5}"
  30.                  HorizontalOptions="Center"
  31.                  VerticalOptions="CenterAndExpand" />
  32.  
  33.         <!-— Semitransparent white -->
  34.         <BoxView Color="{toolkit:HslColor H=0, S=0, L=1, A=0.5}"
  35.                  HorizontalOptions="Center"
  36.                  VerticalOptions="CenterAndExpand" />
  37.  
  38.         <!-- Semitransparent black -->
  39.         <BoxView Color="{toolkit:HslColor H=0, S=0, L=0, A=0.5}"
  40.                  HorizontalOptions="Center"
  41.                  VerticalOptions="CenterAndExpand" />
  42.     </StackLayout>
  43. </ContentPage>
最后两个示例将A属性设置为50%透明度,因此框显示为灰色阴影(或根本不显示),具体取决于背景:

XAML标记扩展的两个主要用途尚未到来。 在第12章中,您将看到Style类,毫无疑问是包含在资源字典中的最受欢迎的项目,在第16章中,您将看到名为Binding的强大标记扩展。

阅读(2306) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~