第十章:XAML标记扩展(一)

简介:

在代码中,您可以从各种不同的来源以各种不同的方式设置属性:

triangle.Angle1 = 45;
triangle.Angle1 = 180 * radians / Math.PI;
triangle.Angle1 = angles[i];
triangle.Angle1 = animator.GetCurrentAngle();

如果此Angle1属性为double,则所需的只是source为double或以其他方式提供可转换为double的数值。
但是,在标记中,double类型的属性通常只能从符合Double.Parse有效参数的字符串中设置。到目前为止,您唯一看到的例外是当目标property被标记为TypeConverter属性时,例如FontSize属性。
如果您可以从显式文本字符串以外的来源设置属性,则可能需要更灵活的XAML。例如,假设您要定义另一种设置Color类型属性的方法,可能使用Hue,Saturation和Luminosity值,但没有x:FactoryMethod元素的麻烦。只是随便,它似乎不可能。 XAML解析器期望设置为Color类型属性的任何值都是ColorTypeConverter类可接受的字符串。
XAML标记扩展的目的是绕过这个明显的限制。请放心,XAML标记扩展不是XML的扩展。 XAML始终是合法的XML。 XAML标记扩展只是扩展,因为它们扩展了标记中属性设置的可能性。标记扩展本质上提供特定类型的值,而不必是值的文本表示。

代码基础架构

严格来说,XAML标记扩展是一个实现IMarkupExtension的类,它是在常规Xamarin.Forms.Core程序集中定义的公共接口,但名称空间为Xamarin.Forms.Xaml:

public interface IMarkupExtension
{
    object ProvideValue(IServiceProvider serviceProvider);
}

顾名思义,ProvideValue是为XAML属性提供值的方法。 IServiceProvider是.NET基类库的一部分,在System命名空间中定义:

public interface IServiceProvider
{
    object GetService(Type type);
}

显然,这些信息并没有提供很多关于编写自定义标记扩展的暗示,事实上,它们可能很棘手。 (您将很快看到一个示例以及本书后面的其他示例。)幸运的是,Xamarin.Forms为您提供了几个有价值的标记扩展。 这些分为三类:

  • 标记扩展是XAML 2009规范的一部分。 它们出现在具有惯用x前缀的XAML文件中,并且是:

    • x:Static
    • x:Reference
    • x:Type
    • x:Null
    • x:Array

它们在包含标记扩展名称的类中实现,其中包含Extension附加的单词 例如,StaticExtension和ReferenceExtension类。 这些类在Xamarin.Forms.Xaml程序集中定义。

  • 以下标记扩展源自Windows Presentation Foundation(WPF),并且除DynamicResource外,还支持Microsoft的其他XAML实现,包括Silverlight,Windows Phone 7和8以及Windows 8和10:

    • StaticResource
    • DynamicResource
    • Binding

这些是在公共StaticResourceExtension,DynamicResourceExtension和BindingExtension类中实现的。

  • 只有一个标记扩展是Xamarin.Forms独有的:与RelativeLayout一起使用的ConstraintExpression类。

尽管可以在代码中使用公共标记扩展类,但它们在XAML中才有意义。

目录
相关文章
|
C#
避免让WPF资源字典变得杂乱臃肿
原文:避免让WPF资源字典变得杂乱臃肿                   避免让WPF资源字典变得杂乱臃肿                           周银辉 今天看到项目种的一个XXXResource.xaml文件代码有二千多行,这引发了我一些思考:如何组织我们的WPF资源。
1056 0
|
C#
艾伟_转载:WPF/Silverlight陷阱:XAML自定义控件的嵌套内容无法通过名称访问
为了说明这个问题,假定我们需要实现一个具有特殊功能的按钮控件。编写Xaml文件如下: Button> 对 Code Behind类,唯一的改动是把向导生成的基类从UserControl改成Button: public partial class XamlButton : Button{    ...
1046 0
|
Windows
UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
原文 UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项 在 Windows 10 的前几个版本中将页面内容扩展到标题栏上还算简单,主要是没什么坑。直到一些新控件的引入和一些外观设计趋势变化之后,扩展标题栏开始出现一些坑了。
1238 0
|
C# Windows
WPF中如何选择合适的元数据标记?(英文)
原文:WPF中如何选择合适的元数据标记?(英文) FrameworkPropertyMetadataOptions Enumeration:Specifies the types of framework-level p...
938 0
|
JavaScript Android开发
|
JavaScript 数据可视化 Android开发
|
存储 JavaScript Android开发
第十章:XAML标记扩展(三)
资源词典 Xamarin.Forms还支持第二种共享对象和值的方法,虽然这种方法比x:静态标记扩展稍微有点开销,但它更通用 - 因为所有东西 - 共享对象和使用的可视元素 它们 - 可以用XAML表示。
1150 0
|
XML JavaScript Android开发
第十章:XAML标记扩展(二)
访问静态成员 IMarkupExtension最简单和最有用的实现之一封装在StaticExtension类中。 这是原始XAML规范的一部分,因此它通常出现在带有x前缀的XAML中。 StaticExtension定义了一个名为Member of string的属性,您可以将其设置为公共常量,静态属性,静态字段或枚举成员的类和成员名称。
1039 0
|
JavaScript Android开发 索引
第八章:代码和XAML协调一致5
点按手势 Xamarin.Forms按钮响应手指点击,但您实际上可以从任何派生自View的类中获取手指点击,包括Label,BoxView和Frame。 这些点击事件不会内置到View类中,但View类会定义名为GestureRecognizers的属性。
1285 0