wpf中xaml的类型转换器与标记扩展
原文:wpf中xaml的类型转换器与标记扩展

这篇来讲wpf控件属性的类型转换器

类型转换器

类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需要类型转换器.两者的应用是非常之相似的.

如设置Margin属性
用xaml方式

<Button Margin="1,2,3,4"></Button>

cs代码

Button btn = new Button();
btn.Margin = new Thickness(1, 2, 3, 4);

通过xaml设置Margin会将此属性通过类型转换器转成Thickness类型.关于类型转换器相关知识,这里不多介绍.下面来介绍xaml的标记扩展功能.

标记扩展

标记扩展在wpf的应用中非常之广泛的.如
数据绑定语法 {Binding Path=…}
静态资源引用 {StaticResource …}
指定数据类型{x:Type prefix:typeNameValue}

标记扩展带来很多好处,一般情况下,xaml的属性值都是文本字符串形式通过类型转换器形式转成对象(标签化语言也存在着局限性).标记扩展可以让属性引用某个静态对象的引用,当然这只是其中的一个功能,语法则是以左右大括号以区别({}).

左上右下问题

这里我们来比较类型转换器做不到的问题

我想大家在刚学wpf或者silverlight的时候,在设置Margin属性的时候,都常常会忘掉四边的顺序,即左上右下,如下blend的属性编辑器.

换个思路,你想把Margin的左上右下的顺序变化就不可以了,因为这是类型转换器,这个顺序是定死的.如果用标记扩展的话,我们可以假设有下面的语法
{Margin Top=76,Left=76,Right=168,Bottom=0}
虽然感觉起来比直接写xx,xx,xx,xx这样麻烦,但增加了灵活性.主要问题是标记扩展可以记录属性值,类型转换器只能用文本字符串表示.
一个复杂属性在xaml的表示方法两种方法都可以,标记扩展提供了一个多的选择.看应用而定.当然在没有类型转换器的情况下,xaml也允许这样写法.相对而言就稍微的复杂一些,一切都是为了简化.

<Button><Button.Margin><Thickness Left="0" Top="0" Right="0" Bottom="0"></Thickness></Button.Margin>
</Button>
<Button Margin="{Margin Top=0,Left=0,Right=0,Bottom=0}" />
<Button Margin="0,0,0,0" />

比较上面三种方式,肯定最后一个最简单,对于记忆不好的也可以尝试第二种,其实第标记扩展也需要你记对象的属性,万一大小写出错那也麻烦,第一种嘛,代码量又太多了,要是都设置一个属性都这样,那代码就多了.所以各有各自的好处.

自定义标记扩展

标记扩展本身与设计时没有关系,但类型转换器却是设计时必须的功能,二两者又有着类似之处,所以这里介绍一下.

下面介绍自定义标记扩展的方法

(1)定义一个派生自System.Windows.Markup.MarkupExtension的类,该类要求重写ProvideValue方法

namespace WPF.Controls
{public class ThicknessExtension : MarkupExtension{public override object ProvideValue(IServiceProvider serviceProvider){throw new NotImplementedException();}}
}

(2)与xml命名空间关联,在程序集项目中的AssemblyInfo添加元数据,XmlnsDefinition元数据可以帮助统一命名空间,因为这样我们才可以很简单的使用wpf内置控件(很多控件都在不同命名空间下),XmlnsPrefix的作用就如asp.net内置控件以asp开始一样<asp:Label />

[assembly: XmlnsDefinition("http://wpf.controls", "WPF.Controls")]
[assembly: XmlnsPrefix("http://wpf.controls", "ext")]

现在我们将ProvideValue方法变更为

public override object ProvideValue(IServiceProvider serviceProvider)
{return new Thickness();
}

然后在xaml中使用该扩展标记

<Window x:Class="WpfApplication1.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:ext="http://wpf.controls"Title="Window1" Height="100" Width="200"><Grid><Button Margin="{ext:Thickness}" Content="Hello" /></Grid>
</Window>

上面代码可以成功运行,我们还需要为扩展标记添加属性,用于传递参数.

(3)添加属性. 在xaml中添加的对象,都以默认的构造函数进来,同时可以用MarkupExtensionReturnType指定标记扩展返回的安全类型

[MarkupExtensionReturnType(typeof(Thickness))]
public class ThicknessExtension : MarkupExtension
{public override object ProvideValue(IServiceProvider serviceProvider){return new Thickness(Left,Top,Right,Bottom);}public ThicknessExtension(){}public double Bottom { get; set; }public double Left { get; set; }public double Right { get; set; }public double Top { get; set; }
}

现在就可以使用了

<Button x:Name="demo" Margin="{ext:Thickness Left=10,Bottom=10,Right=10,Top=30}"Content="Hello"></Button>

posted on 2018-12-17 10:19 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10129900.html

wpf中xaml的类型转换器与标记扩展相关推荐

  1. WPF中,如何将Vista Aero效果扩展到整个窗口

    WPF中,如何将Vista Aero效果扩展到整个窗口 原文:WPF中,如何将Vista Aero效果扩展到整个窗口   WPF中,如何将Vista Aero效果扩展到整个窗口             ...

  2. java converter转换器_在SpringMVC中设置自定义类型转换器Converter

    前言 在SpringMVC中为我们提供了许多内置的类型转换器,当我们在HTML表单中发起一个请求时,Spring会根据表单项中name属性的值映射到POJO的属性名,调用相对性属性的set方法帮我们把 ...

  3. springboot中mongodb自定义类型转换器

    文章目录 1 场景 1.1 BigDecimal写入mongo 1.2 人工转换 1.3 自定义转换器 2 版本 3 步骤 3.1 定义转换器 3.2 配置mongoDb工厂类 3.3 加载自定义转换 ...

  4. 解读WPF中的Xaml

    1.Overview 这篇文章主要分享从源代码角度解读wpf中xaml.由于源码查看起来错综复杂"随便找一个对象按下F12就是一个新的世界",看源码的感觉就是在盗梦空间里来回穿梭: ...

  5. XAML实例教程系列 - 类型转换器(Type Converter)

    在XAML中每一个对象元素映射一个实例,而实例属性可以通过特性(Attributes)进行赋值.在实际项目开发中,对象元素的属性值可以是不同数据类型,根据需求不同,经常需要对数据类型进行转换,就需要使 ...

  6. Mybatis中的类型转换器

    无论是mybati是向数据库中存储数据还是将数据读取出来都需要涉及类型转换器. Mybatis再带的类型转换器:[部分] 自定义类型处理器 自定义类型转换器的解决方案: 重写已经有的类型转换器. 新建 ...

  7. WPF - 自定义标记扩展

    在使用WPF进行编程的过程中,我们常常需要使用XAML的标记扩展:{Binding},{x:Null}等等.那么为什么WPF提供了XAML标记扩展这一功能,我们又如何创建自定义的标记扩展呢.这就是本文 ...

  8. WPF学习:4.类型转换和标记扩展

    在上一章,主要介绍了Border和Brush,这一章主要介绍下类型转换和标记扩展.相关代码链接如下: http://files.cnblogs.com/keylei203/4.WPFSampleDem ...

  9. 【转】Struts2中转换Date类型的问题

    好久没有写Blog了,最近似乎变懒了.今天上班没有很多事,于是把之前遇到的一个问题记录下来. Web开发会涉及到很多类型转换的情况.我们知道,页面中的一切值都是字符串类型,而到后台,我们需要的可能是其 ...

最新文章

  1. 一文梳理视觉Transformer架构进展:与CNN相比,ViT赢在哪儿?
  2. AngularJs 基础教程 —— 依赖注入
  3. linux系统lsmod命令,linux lsmod命令 及相关信息
  4. 不能头脑一热,就布局颠覆性技术、上马未来产业
  5. 强烈谴责中国红十字会
  6. (软件工程复习核心重点)第四章总体设计-第三节:启发规则
  7. HDU4907小技巧
  8. python qt gui快速编程_《PYTHON QT GUI快速编程 PYQT编程指南》源码
  9. nodejs npm和yarn 源管理模块 yrm(记录方便查看)
  10. PHP文件中定义加载资源文件
  11. JAVA与js加密解密我常用的方法
  12. 音频变压器阻抗匹配及案例
  13. 调用JS函数的内部函数
  14. Java多线程系列--“JUC集合”07之 ArrayBlockingQueue
  15. GEE实战3:利用GEE获取区域的长系列日均气温变化【逐日气温变化分析】
  16. Python初学笔记1-【循环语句】
  17. 淘宝之初:湖畔花园小区里诞生的巨人
  18. 计算机科学中的数学等(视频)
  19. 2021年12月13日|14日|15日|16日|17日
  20. 少儿编程培训 python

热门文章

  1. 2017-05-23 前端日报
  2. 动态生成一个继承接口的类
  3. XLS封装成EXE制作全攻略
  4. Codeforces 809A - Do you want a date?(数学+排序)
  5. Android 判断当前屏幕是横屏还是竖屏
  6. 函数,匿名函数新认知(与预解释、作用域的关系)
  7. FineUI(开源版)v4.2.2发布(8年125个版本,官网示例突破300个)!
  8. Win2000域控制器+Exchange2000迁移至Win2003域控制器+Exchange2003
  9. 石川es6课程---9、面向对象-基础
  10. legend3---laravel中获取控制器名称和方法名称