类型转换

前面讲到过,在定义元素时可以通过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. OpenModelica读取文件

    parameter String file = Modelica.Utilities.Files.loadResource("J:/git/tcs/tcs.txt"); 将文件名变 ...

  2. Skip level 1 on 1

    2019-01-08 16:43:29 Skip level 1:1 什么是 Skip level 1 on  1 :你和你老板的老板(的老板) 1:1 如果你的老板是first line manag ...

  3. ThinkPHP3.2.3中使用smarty模板引擎循环

  4. echarts画多条一元回归线

    理论上两点一线,只要两个点即可 option = { title: { text: '', left: 'center' }, tooltip: { // trigger: 'item', // fo ...

  5. eclipse报错:Could not resolve bean definition resource pattern [classpath:spring/applicationContext-*.xml]或者找不到

    1.把xml文件复制到WEB-INF下 2.路径改成 [/WEB-INF/spring/applicationContext-*.xml]

  6. spring cloud: Hystrix(六):feign的注解@FeignClient:fallbackFactory(类似于断容器)与fallback方法

    fallbackFactory(类似于断容器)与fallback方法 feign的注解@FeignClient:fallbackFactory与fallback方法不能同时使用,这个两个方法其实都类似 ...

  7. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格动态加载

    jQuery EasyUI 树形菜单 - 树形网格动态加载 动态加载树形网格有助于从服务器上加载部分的行数据,避免加载大型数据的长时间等待.本教程将向您展示如何创建带有动态加载特性的树形网格(Tree ...

  8. 1.4 Crack小实验

    0_day 第一章 基础知识 1.4 Crack小实验 <0day_2th>王清 著 电子书 下载链接:https://pan.baidu.com/s/11TgibQSC3-kYwCInm ...

  9. android -------- Data Binding的使用(三)Observable

    解决:databinding 中 ViewModel数据发生改变,View中也要改变(实时更新) BaseObservable 在ViewModel 中可以继承 BaseObservable publ ...

  10. redis 基本指令

    redis-cli开启redis客户端 1. set key value // 设置key-value 2. get key // 获取key 3. delete key [] // 删除key 4. ...