#uwp# XMAL

类型转换

在xaml中对属性赋值时,会将填入的字符串转换成对应的属性类型。比如:

  • <Button Visibility="Visible" /> 会将Visible这个字符串转换成一个枚举值
  • <Button Content="按钮演示" Foreground=“Blue”/> Foreground属性的数据类型是Brush,通过SolidColorBrush对Color进行赋值,在以上代码中,XAML语法解析器需要使用类型转换器(Type Converters)将简单文本字符串“Blue”,转换为对应的“Brush”画刷类型,其颜色值为Red=0,Green=0,Blue=255,Aplha=255。 对应后台代码类型转换是:
Button button = new Button {
Foreground = new SolidColorBrush(Color.FromArgb(0, 0, 255, 255))
};

转换过程主要是以下两个步骤:

  • XAML语法解析器会检查需要赋值的属性是否存在内置类型转换器。如果发现对应类型转换器,则将属性字符串转换为对应.Net类型
  • 如果没有发现内置类型转换器,XAML语法解析器将查找元素对象中是否使用标记扩展调用自定义类型转换器
  • 如果以上两个步骤都没有发现对应类型转起的存在,XAML语法解析器将返回类型错误

XAML命名空间

<Page
x:Class="Application1.BlankPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  • xmlns:XAML文件几乎总是在其根元素中声明一个默认 XAML 命名空间。 默认 XAML命名空间定义了无需使用前缀限定即可声明的元素。 对于典型的 Windows 运行时应用项目,此默认命名空间包含用于 UI 定义的所有 Windows 运行时的内置 XAML 词汇:默认控件、文本元素、XAML图形和动画、数据绑定和样式支持类型等。
  • xmlns:x定义xaml的所有通用规则
  • x:Class为XAML页面指定对应代码隐藏文件的命名空间和类名

使用属性元素语法设置属性

一个对象的许多属性可使用属性元素语法设置。

属性元素看上去如下所示:<object.property>

在下面的语法中,property是你想要设置的属性的名称,propertyValueAsObjectElement是应当满足属性的值类型要求的单个对象元素。

<object>
<object.属性>
propertyValueAsObjectElement
</object.属性>
</object>

下面的示例使用属性元素语法来设置一个具有SolidColorBrush对象元素RectangleFill。 (在 SolidColorBrush 内,Color被设置为一个属性。)此 XAML 的分析结果等同于前面使用属性语法设置 Fill 的 XAML 示例。

<Rectangle
Name="rectangle1"
Width="100"
Height="100"
>
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>

使用集合语法设置属性

在 XAML 中,有几个集合语法的变体。这一眼看上去似乎允许您“设置”只读集合属性。而实际上,XAML 允许的操作是向现有集合中添加项。实现 XAML 支持的 XAML 语言和 XAML 处理器依赖于后备集合类型中的约定来启用此语法。

当 XAML 处理器遇到 XAML集合语法中的一个或多个对象元素时,首先通过使用其对象标记创建每个此类对象,然后通过调用集合的 Add 方法以声明顺序将每个新对象添加到包含集合中。

下面的示例演示了一个使用可构造集合类型的集合属性(可以定义实际的集合并将其实例化为 XAML 中的一个对象元素)。

<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<!-- Here the GradientStopCollection tag is specified. -->
<GradientStopCollection>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>

不过,对于采用集合的 Windows Phone 属性而言,XAML分析器可根据集合所属的属性隐式知道集合的后备类型。因此,可以省略集合本身的对象元素,如下面的示例所示。

<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<!-- no explicit new GradientStopCollection, parser knows how to find or create -->
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>

另外,有一些属性不但是集合属性,还标识为类的 XAML 内容属性。前面示例中以及许多其他 Windows Phone 属性中使用的GradientStops属性就是这种情况。在这些语法中,也可以省略属性元素。这生成以下标记:

<LinearGradientBrush>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush>
上一篇:Nginx知多少系列之(六)Linux下.NET Core项目负载均衡


下一篇:Hash表的表大小