第十章: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资源。
1132 0
|
4月前
|
容器 C# 开发者
XAML语言大揭秘:WPF标记的魅力所在,让你轻松实现界面与逻辑分离,告别复杂代码!
【8月更文挑战第31天】XAML提供了一种直观且易于维护的界面设计方式,使得开发者可以专注于逻辑和业务代码的编写,而无需关心界面细节。通过数据绑定、布局管理和动画效果等特性,XAML可以实现丰富的界面交互和视觉效果。在实际开发过程中,开发者应根据具体需求选择合适的技术方案,以确保应用程序能够满足用户的需求。希望本文的内容能够帮助您在WPF应用程序开发中更好地利用XAML语言。
48 0
|
C#
艾伟:Silverlight 里如何实现隐式样式,ImplicitStyleManager 的实现思想
在 WPF 中,我们可以方便的在全局范围定义一个样式,就可以应用到所有这种类型的对象,这就是所谓的隐式样式(implicit Style),比如: WPF中定义样式 Button aButton b 这样之后,两个按钮就都变成了浅蓝色的背景。
963 0
|
C#
艾伟_转载:WPF/Silverlight陷阱:XAML自定义控件的嵌套内容无法通过名称访问
为了说明这个问题,假定我们需要实现一个具有特殊功能的按钮控件。编写Xaml文件如下: Button> 对 Code Behind类,唯一的改动是把向导生成的基类从UserControl改成Button: public partial class XamlButton : Button{    ...
1083 0
|
C# Windows
WPF中如何选择合适的元数据标记?(英文)
原文:WPF中如何选择合适的元数据标记?(英文) FrameworkPropertyMetadataOptions Enumeration:Specifies the types of framework-level p...
964 0
|
JavaScript Android开发
|
JavaScript 数据可视化 Android开发
|
存储 JavaScript Android开发
第十章:XAML标记扩展(三)
资源词典 Xamarin.Forms还支持第二种共享对象和值的方法,虽然这种方法比x:静态标记扩展稍微有点开销,但它更通用 - 因为所有东西 - 共享对象和使用的可视元素 它们 - 可以用XAML表示。
1194 0
|
XML JavaScript Android开发
第十章:XAML标记扩展(二)
访问静态成员 IMarkupExtension最简单和最有用的实现之一封装在StaticExtension类中。 这是原始XAML规范的一部分,因此它通常出现在带有x前缀的XAML中。 StaticExtension定义了一个名为Member of string的属性,您可以将其设置为公共常量,静态属性,静态字段或枚举成员的类和成员名称。
1061 0