类型转换

前面讲到过,在定义元素时可以通过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. hdu-5707-Combine String

    题意:给你三个字符串,让你计算1 2 串和3 串是否匹配,就是3串可以分解为 1  2 串,字母顺序必须是按照1 2 串的字母前后顺序. DP代码太深奥 看不太透,这个代码比较好理解一点: #incl ...

  2. ASP.net 网站开发知识点总结

    一.常用技术概括及介绍 1. SQL server:处理数据库的设计 2. asp.net  3. html            :前端网页 4. css :网页的布局设计 5. JavaScrip ...

  3. img 下方的4px像素问题

    问题:在一个div块里面放了一个图片,图片下面有内容,可以不管怎么调试,在火狐浏览器,IE6下.图片img底部多出了4个像素 解决:img样式中   vertical-align: top/middl ...

  4. long long 与__int64

    //为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数 //结果VC中还是认为是32位的,显然不合适 //typedef signed long int    ...

  5. HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK阅读笔记

    HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL  DEEP  CONVOLUTIONAL NEURAL NETWORK 论文地址:https:/ ...

  6. 解决UnicodeEncodeError。python的docker镜像增加locale 中文支持

    用pandas的pd.read_excel()打开中文名的xlsx,报错,本来以为是xlrd的问题后来发现,是open()函数就报错: “UnicodeEncodeError: 'ascii' cod ...

  7. Java 动态图片压缩

    今天收到领导的一个任务,说是图片太大导致服务器那边无法解析,要求图片大小大于102*126就压缩大小为102*126.同时文件是以Base64字符串的形式传过来的.具体压缩方法如下: /** * 图片 ...

  8. 网格视图GridView的使用

    网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现. 本文将以一个具体的实例来说明如何使用GridV ...

  9. 关于类、方法、对象(实例):通过一个例子看一下self都做了哪些事情

    我们在定义一个类时,经常会在类的各个方法中看到self,那么在程序执行时self到底起了什么作用,什么时候要加self,这一点需要我们思考并好好理解.之前在学习时没有想这么多,加之用pycharm写代 ...

  10. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格惰性加载节点

    jQuery EasyUI 树形菜单 - 树形网格惰性加载节点 有时我们已经得到充分的分层树形网格(TreeGrid)的数据. 我们还想让树形网格(TreeGrid)按层次惰性加载节点. 首先,只加载 ...