UWP基础教程 - XAML类型转换器

在XAML中每一个元素对象对应一个实例,而实例属性可以通过属性进行赋值。在实际项目开发中,对象元素的属性值可以是不同数据类型,根据需求不同,经常需要对数据类型进行转换,就需要使用XAML的类型转换器(Type Converters)。本文将讲解XAML类型转换器的使用。

在Windows 10 UWP应用开发中,经常会用到类型转换器,例如对按钮的内容进行赋值,代码如下:

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

ButtonContent属性被赋值为字符串类型“演示按钮”。XAML语法解析器可以将字符串类型转换为对应的.Net类型,然后进行赋值操作。而如果在按钮控件中,添加内容文本颜色属性,

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

在.Net Framework中,Foreground属性的数据类型是Brush,通过SolidColorBrush对Color进行赋值,在以上代码中,XAML语法解析器需要使用类型转换器(Type Converters)将简单文本字符串“Red”,转换为对应的“Brush”画刷类型,其颜色值为Red=255,Green=0,Blue=0,Aplha=255。 对应后台代码类型转换是:

Button button = new Button { Foreground = new SolidColorBrush(Color.FromArgb(255, 0, 0, 255)) };

这一转换过程是由.Net Framework内置类型转换器实现的,无需开发人员干涉。

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

  1. XAML语法解析器会检查需要赋值的属性是否存在内置类型转换器,如果发现对应类型转换器,则将属性的属性值字符串转换为对应的.Net类型;
  2. 如果没有发现内置类型转换器,XAML语法解析器将查找元素对象中是否使用标记扩展(Markup Extensions)调用自定义类型转换器;

如果以上两个步骤都没有发现对应类型转换器的存在,XAML语法解析器将返回类型错误。 因为XAML支持标记扩展(Markup Extensions),可以在运行时对属性进行赋值,而属性值类型通常需要进行对应的类型转换才能正常使用,所以在实际项目中,经常会用到XAML类型转换器功能,不仅仅局限于项目内置类型转换器,同时还允许开发人员通过继承TypeConverter类创建自定义类型转换器。

下面来看一下如何自定义一个类型转化器

class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return Visibility.Visible;
        return (bool)value ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return true;
        return ((Visibility)value == Visibility.Visible);
    }
}

XAML类型转换器必须实现接口IValueConverter,在ConvertConvertBack中创建转换器逻辑代码。

上面的例子就是将Bool类型转化为Visibility类型,以及将Visibility类型反转为Bool类型

<Page.Resources>
    <local:BoolToVisibilityConverter x:key = "converter"
</Page.Resources>

<TextBox Visibility = {Binding isShow , Converter={StaticResource converter}} />

使用方法如上,ConvertBack主要用于双向绑定中,如果没有双向绑定的需求,可以只实现Convert即可。

在C#代码里面可以这么写

Test test= new Test();
test.isShow = false;
 
Binding binding = new Binding( "isShow" );
binding.Source = test;
binding.Converter = new BoolToVisibilityConverter();

大家可以动手试试,有什么问题欢迎留言。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏容器云生态

Golang正则模块使用

最近在开发过程中会遇到一些字符串匹配相关的内容,正好去大概学习了下Golang中的regexp模块。因为目前正则模块对我来说更多的就是去匹配并处理字符串的,因此...

2455
来自专栏Python爱好者

Python高效编程(一)

2139
来自专栏Android相关

X86 Assemble指令--ptr

在Assemble中通常会看到WORD ptr或者DWORD ptr或者BYTE ptr等关键字,这些关键字主要用来标识指令操作数的大小(或者说长度) WOR...

902
来自专栏C/C++基础

web前端开发初学者十问集锦(4)

利用JS来控制页面控件的显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位。

1602
来自专栏计算机视觉与深度学习基础

Leetcode 290. Word Pattern

Given a pattern and a string str, find if str follows the same pattern. Here ...

3729
来自专栏逸鹏说道

AutoMapper随笔记

平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果...

3425
来自专栏coder修行路

Go 处理yaml类型的配置文件

5784
来自专栏阮一峰的网络日志

async 函数的含义和用法

本文是《深入掌握 ECMAScript 6 异步编程》系列文章的最后一篇。 Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义...

2806
来自专栏数据之美

Shell 参数扩展及各类括号在 Shell 编程中的应用

今天看有人总结了 shell 下的参数扩展,但不是很全,恰好以前整理过放在百度空间,但百度空间目前半死不活的情况下对 Google 非常不友好,索性一并转过来方...

2097
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版3.3节栈布局之局部变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

761

扫码关注云+社区

领取腾讯云代金券