这篇来讲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(); }
<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>
发表评论
-
wpf开发常见问题(1)
2008-10-22 21:42 1589经过一段时间wpf的学习和实际开发.现在与大家分享 ... -
初始化集合项依赖属性
2008-11-03 13:38 810在wpf自定义属性时,若此属性为集合类型的话,如 ... -
WPF and SL RadioButtonList Tip
2008-11-03 14:03 802在以下情境下.使用数据绑定分离UI与后端Model ... -
wpf datagrid笔记 part 1
2008-12-10 23:35 28901,基本属性 开关基本 ... -
Prism V2之旅(2)
2009-01-07 10:02 1159本篇将介绍Prism中Region的使用. 本篇D ... -
Prism V2之旅(3)
2009-01-07 15:24 856上篇介绍了Region的基本应用,这篇接上篇,继续介绍 ... -
Prism V2之旅(4)
2009-01-07 23:42 941上篇介绍了RegionAdapter的作用及如何如何 ... -
Prism V2之旅(5)
2009-01-13 11:54 1093上篇介绍了WPF的Attach Behavior(附加行 ... -
Prism V2之旅(6)
2009-01-13 15:14 1030这篇来讲事件.事件主要用来交互. 监听事件 我订 ... -
prism v2之旅(7)
2009-01-15 23:53 1138这篇继续介绍Module的功能. 第5篇已经介绍过模块的 ... -
XAML Guidelines
2009-01-17 11:31 835http://blogs.msdn.com/jaimer ... -
wpf控件设计时支持(3)
2009-02-02 14:12 2769wpf设计时调试 编辑模型 装饰器 1.wpf ... -
wpf控件样式管理示意图
2009-02-04 14:40 1643...
相关推荐
HTML 和 XAML 是两种不同的标记语言,分别用于创建 Web 页面(HTML)和构建 Windows Presentation Foundation (WPF) 应用程序(XAML)。本项目旨在提供一个转换工具,使得开发者可以方便地在两者之间进行互转,从而...
在XAML中,我们使用`Binding`标记扩展来实现这一点: ```xml ``` 这里的`MyProperty`是数据对象的一个属性,`TextBlock`的`Text`属性将绑定到这个属性。 **数据上下文(DataContext)** 在WPF中,`DataContext`...
XAML是WPF中的主要标记语言,用于描述用户界面和3D场景。 首先,让我们了解WPF中的3D模型开发。WPF提供了一个强大的框架,支持2D和3D图形渲染,允许开发者创建丰富的、交互式的用户界面。在3D环境中,你可以加载、...
4. **事件处理**:XAML中的事件绑定需要转换为JavaScript的事件监听器,以便在浏览器环境中实现相同的功能。 5. **数据绑定**:XAML中的数据绑定机制也需要适配到JavaScript的MVVM(Model-View-ViewModel)框架,如...
而XAML(Extensible Application Markup Language)是WPF中用于定义用户界面的XML标记语言,可以用来描述3D场景和对象,使得3D模型能直接在WPF应用程序中渲染。 为了将3ds格式的模型转换为适用于WPF的XAML文件,...
此工具特别关注WPF(Windows Presentation Foundation)应用,它能够解析和显示XAML(eXtensible Application Markup Language)代码,这是WPF用来构建用户界面的标记语言。 ILSpy2.1的改进点主要在于批量保存XAML...
在WPF中,我们可以创建复杂的用户界面,并通过XAML(可扩展应用程序标记语言)进行声明式编程。 **MVVM(Model-View-ViewModel)框架** 是一种设计模式,广泛应用于WPF和.NET应用中。它分离了用户界面(View)、...
在XAML中,类型转换器用于将基本类型的值转换为更复杂的类型。例如,可以通过类型转换器将字符串转换为颜色。这种转换通常在处理UI元素的属性时发生。 #### 标记扩展 标记扩展是XAML中的一种特殊语法,用于引用...
5. **继承自标记扩展(Markup Extension)**:虽然不常见,但也可以创建一个自定义的标记扩展,实现`IMarkupExtension`接口,从而在XAML中直接使用值转换器。 标签中提到的`.NET3.5`、`WPF`和`XAML`是这个问题所...
5. 类型转换器:在WPF中,类型转换器用于处理XAML中定义的属性值。电子书会展示如何实现一个自定义的类型转换器,以便在XAML中直接使用复杂的数据类型。 6. 核心WPF类层次结构:WPF框架中的类层次结构是构建复杂...
**类型转换器**在WPF中允许不同类型的对象之间进行转换,特别是在数据绑定时。例如,一个字符串可能需要被转换为整数或日期来匹配数据源。自定义类型转换器可以通过继承`System.ComponentModel.TypeConverter`类实现...
接下来,我们可以在XAML中使用`{x:Static}`标记扩展将这个静态变量绑定到TextBox控件: ```xml ``` 这里的`local`前缀是指命名空间别名,确保XAML能正确找到`StaticData`类。 然而,直接绑定静态变量可能无法达到...
- **类型转换器**:允许将字符串值转换为适当的类型。 - **XAML根元素和命名空间**:每个XAML文件都有一个根元素,如`<Window>`或`<Page>`,并关联到相应的命名空间,用于解析对象和属性。 - **自定义前缀和自定义...
在实际项目中,你可能需要根据需求调整静态变量的类型和更新机制,例如,如果静态变量是复杂类型,你可能需要自定义转换器或者使用`ObservableObject`来处理更改通知。 在提供的压缩包文件`WpfTestBindStaticField`...
- **类型转换器**:XAML支持将字符串特性值转换为适当的类型,如将字符串"True"转换为布尔值true。 - **XAML根元素和命名空间**:每个XAML文件都有一个根元素,通常定义了文件使用的XAML命名空间,如`...
### WPF教程(中文)ch02:XAML...此外,XAML还支持诸如属性元素、类型转换器和标记扩展等高级特性,极大地增强了其在实际开发中的灵活性和功能性。理解和掌握XAML的基本概念和语法,对于有效地开发WPF应用程序至关重要。
- **数据绑定原理**:这部分介绍了WPF中数据绑定的基本概念,包括数据源、绑定路径和转换器等。 - **数据绑定的好处**:解释了数据绑定对于提高应用程序的灵活性和响应性的重要性。 ##### 4.2 WPF数据绑定之绑定源 ...
- **类型转换器**:允许将字符串值转换为特定类型,以便用作属性值。 - **根元素和XAML命名空间**:每个XAML文件都有一个根元素,通常与XAML命名空间相关联,以避免命名冲突。 - **自定义前缀和自定义类型**:允许...
综上所述,WPF中的上传功能涉及到了数据绑定、转换器、XAML命名空间、数据字典的使用、文件操作的准备以及潜在的后台服务交互等多个方面。为了实现完整的文件上传功能,还需要考虑异步处理、错误处理和安全性等多个...