类型转换

前面讲到过,在定义元素时可以通过Attributes特性方式为其设置属性并为属性赋值,在实际开发中所赋予的值可能和属性本身的数据类型不相符,这时XAML解析器就会使用类型转换器(Type Converter)对数据类型进行转换。

XAML中的类型转换是由.Net Framework的内置类型转换器自动实现的,转换过程是:XAML语法解析器首先检查被赋值的属性是否存在相应的内置类型转换器,如果存在,则将属性值字符串转换成对应的.Net类型;如果没有找到相应的内置类型转换器,XAML语法解析器将在元素定义中查找是否使用了标记扩展调用自定义的类型转换器;如果前面两步都没有找到相应的类型转换器,则XAML语法解析器将返回类型转换错误。

在应用程序开发中,经常会用到类型转换器将字符串类型转换为特定的类型对象赋值给元素的属性。例如,向一个页面中添加一个Button按钮,设置Content属性值为"按钮演示",相应的XAML代码片段如下所示:

<Button Content="按钮演示"/>

"按钮演示"是一个字符串类型,XAML语法解析器会将此字符串类型转换为对应的.Net类型,然后赋值给Content属性。

在上面例子的基础上,再设置Button按钮的Foreground属性值为Blue,代码如下所示:

<Button Content="按钮演示" Foreground="Blue"/>

在.Net Framework中,Foreground属性的数据类型是Brush类型,因此XAML语法解析器会使用类型转换器将字符串"Blue"转换为对应的Brush类型,其颜色值为:Red=0、Green=0、Blue=255、Aplha=255,其中Aplha表示透明度。类型转换的后台代码如下所示:

Button sampleButton = new Button { Content = "按钮演示", Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 0, 255)) };

此外,XAML中也允许开发人员自定义类型转换器,但是该类型转换器要继承于TypeConverter类,并且要重写其中的CanConvertFromCanConvertToConvertFromConvertTo方法。

3.2.6 资源字典

资源可以理解为不可执行的数据对象,如图片、视频、音频、文档等,并且在应用程序中可以被重复使用。在XAML语言中,样式、模板、画笔、动画、转换器等都被看做是资源,并通过将这些资源定义在资源字典(Resource Dictionary)中来实现资源共享。

资源字典是一个通过键来管理资源的字典对象,也就是字典中的每个资源都具有一个键来唯一标识该资源。资源字典对应System.Windows命名空间下的ResourceDictionary类,可以被FrameworkElement类和Application类继承。

1. 资源字典的分类

资源的定义位置不同,其有效使用范围也会不同。按照资源的使用范围,资源字典可分为3种类型,分别为直接资源字典、应用程序资源字典和独立资源文件。下面来逐一介绍这三类资源字典。

(1)直接资源字典

在FrameworkElement.Resources属性元素下定义的资源字典被称为直接资源字典。例如,在一个Grid元素下定义资源字典,相应的XAML语法格式如下所示:

<Grid>

  <Grid.Resources>

   <!--define reourse1-->

     <!--define reourse2-->

      ...

  </Grid.Resources>

</Grid>

在Grid.Resources属性元素内定义的每个资源都会有一个x:Name或x:Key属性,这样Grid元素的所有子孙元素就可以通过x:Name或x:Key属性的值来引用相应的资源,实现该Grid范围内的资源共享。

(2)应用程序资源字典

对于一些可在多个页面中重复使用的资源,可以把这些资源定义在Application.Resources属性元素下,相应的XAML语法格式如下所示:

<Application>

<Application.Resources>

<!--define reourse1-->

<!--define reourse2-->

...

</Application.Resources>

</Application>

这样,在Application元素下定义的资源将可以在整个应用程序范围内共享。

(3)独立资源文件

在实际应用开发中,还可以将资源定义在单独的XAML文件中,这些XAML文件被称为资源字典文件。以后,就可以通过资源引用或合并资源字典的方式来使用这些资源,而不需要重复定义。

2. 资源引用

在资源定义之后,可以通过引用资源来为元素的属性提供数据源。在XAML中,可以使用StaticResource标记扩展引用资源,也可以在后台编写代码来引用。

)使用StaticResource标记扩展引用资源

StaticResource标记扩展的作用和使用方法在3.2.4节中已经讲解了,下面通过一个例子来演示如何使用该标记扩展引用资源。在一个打开的Windows应用商店项目中新建一个空白页,并命名为StaticResourcePage。双击打开此页面的StaticResourcePage.xaml文件,在Grid元素中添加如下代码:

<Grid.Resources>

<Style TargetType="Border" x:Key="BorderStyle">

<Setter Property="BorderBrush" Value="Blue"/>

<Setter Property="BorderThickness" Value="4"/>

</Style>

</Grid.Resources>

<Border Style="{StaticResource BorderStyle}" Margin="276,50,717,415"/>

在上面的代码中,先定义了一个键为"BorderStyle"的边框样式资源,在样式中设置边框的颜色为蓝色,边框的粗细为4像素,然后添加了一个Border控件,通过StaticResource标记扩展引用样式资源BorderStyle赋值给Style属性,并使用鼠标将控件拖动到合适的位置。

运行此页面,界面效果如图3-5所示。

图3-5 使用StaticResource标记扩展引用资源的效果

Win10系列:UWP界面布局基础4的更多相关文章

  1. Win10系列:UWP界面布局基础1

    随着技术的不断发展,使用者对应用程序的界面体验提出了更高的要求,为了应对越来越复杂的界面设计需求和有效的简化界面开发过程,微软公司在其应用程序的开发技术当中引入一套新的应用程序界面描述语言,这就是XA ...

  2. Win10系列:UWP界面布局基础8

    路由事件 XAML不仅继承了传统的事件处理方式,还引入了一个增强型事件处理机制:路由事件(RoutedEvent).路由事件和传统事件的不同是:路由事件允许一个对象触发事件后,可以同时拥有多个事件接收 ...

  3. Win10系列:UWP界面布局基础7

    2.附加属性 有一些XAML元素,其自身的属性大多是在其它的元素中声明和使用的,该元素本身却很少使用,这些在其他元素中声明和使用的属性被称为附加属性(Attached Properties).附加属性 ...

  4. Win10系列:UWP界面布局基础2

    属性设置 在面向对象程序开发中,所提及的属性通常指的是对象的属性.在XAML代码中,定义元素时也可以为其设置属性,例如对于一个TextBox元素,有背景属性.宽度属性和高度属性等.为了满足实际应用的需 ...

  5. Win10系列:UWP界面布局基础12

    画刷 画刷(Brush)用于为图形元素填充颜色.在XAML中,画刷有许多属性,其中较常使用的是Fill属性和Stroke属性,Fill用于填充图形的背景色,而Stroke用于设置图形的线条颜色. 在实 ...

  6. Win10系列:UWP界面布局基础11

    样式继承 为了使样式便于维护及重复使用,可以在一个样式上引用其他的样式,这就是样式继承.样式继承的方法是:在Style元素的BasedOn属性上使用StaticResource标记扩展来引用被继承的样 ...

  7. Win10系列:UWP界面布局基础5

    (2)编写后台代码访问资源 下面通过一个例子来演示如何编写后台代码引用资源.新建一个Windows应用商店的空白应用程序项目,将其命名为AccessResourceApplication,打开项目下的 ...

  8. Win10系列:UWP界面布局基础3

    在实际项目开发中,为控件属性赋值时经常会遇到属性值在设计时处于未知状态,而只有在应用程序运行时才能获取到.这种情况下,直接赋值方法是无法满足的,可以使用XAML标记扩展(Markup Extensio ...

  9. Win10系列:UWP界面布局基础9

    在XAML中,样式.模板.画笔和动画等都被看做是资源,它们最终的作用都是相同的,就是让设计人员可以使用这些资源创建更好的视觉效果,对其设计的产品外观进行标准化统一,那么如何使用这些资源并组织和重用呢, ...

随机推荐

  1. 堆+建堆、插入、删除、排序+java实现

    package testpackage; import java.util.Arrays; public class Heap { //建立大顶堆 public static void buildMa ...

  2. MySql连接时出现1251 client does no support authentic错误解决方法

    使用Navicat Premium软件连接时,报错: 解决方法: 修改配置项:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password B ...

  3. 分散的配置文件VS集中的注册表

    假设有这样一个工程,是这样设计的: 1整个软件.服务被切分为 由若干独立的多道程序(多个进程/微服务): 2 这些多道程序只是“机制mechanism”,而“策略strategy”写在各自用到的配置文 ...

  4. d3 + geojson in node

    d3.js本来主要是用于用“数据驱动dom”,在浏览器端,接收后端数据,数据绑定,渲染出svg. 即使是在ng中用,也是会由框架打包,供客户端下载. 那么,如果用所谓后端渲染,发布静态的svg,那就要 ...

  5. mui 访问系统相册将图片显示到网页

    访问系统相返回值为一个对象,通过转换为字符串可以查看,path.files[0]为返回路径去除路径赋值到src 调用摄像头返回的相片的path为一个路径通过 plus.io.resolveLocalF ...

  6. js判断字符串与字符串相互包含,以及数组是否包含某个元素;

    需求:判端一个字符串是否包含另一个字符串? 实现: var str  = "adc"; 判断str 中是否包含 "c" if( str.indexOf(&quo ...

  7. 日常英语---十一、MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider)

    日常英语---十一.MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider) 一.总结 一句话总结:骑着鹰的快速飞行的恶魔,进入地图后跟着你. ...

  8. learn the python the hard way习题26~30总结

    考试试题26错误总结: 漏写字母,括号 写错字母 write(),read()的使用:只能打开使用了 open() 后返回的文件对象(file object),而不能直接使用文件名 if 语句中,条件 ...

  9. 利用adb截图然后传到电脑

    首先配置好adb环境变量 然后adb devices查看是否连接手机,记得把手机调成开发者模式. 截屏 adb shell /system/bin/screencap -p 路径/文件名.后缀名 ad ...

  10. phpmyadmin getshell

    执行SQL语句:SET GLOBAL general_log = ON