WPF 之 XAML语法,对象属性赋值(简单赋值、TypeConverter 标签属性与对象属性映射、标记扩展),引用外部库
2014-01-14 14:02
447 查看
一、XAML树形结构
框架都是树形的,以<Window>对象为根节点,一层一层向下包含。这种树形结构对于WPF整个体系都具有非常重要的意义,它不但影响着UI的布局设计,还深刻的影响着WPF的属性(Property)子系统和事件(Event)子系统等方方面面。在实际的编程过程中,我们经常要在这棵树上进行按名称查找元素,获取父/子节点等操作,为了方便操作这棵树,WPF基本类库为程序员准备了 VisualTreeHelper和 LogicTreeHelper 两个助手类(Helper Class),同时还在一些重要的基类里封装了一些专门用于操作这棵树的方法。
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="532" Loaded="Window_Loaded"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="250*" /> <ColumnDefinition Width="266*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="42" /> <RowDefinition Height="48" /> <RowDefinition Height="66" /> <RowDefinition Height="153" /> </Grid.RowDefinitions> <TextBox HorizontalAlignment="Center" Margin="10,10,0,0" Name="textBox1" VerticalAlignment="Top" Grid.ColumnSpan="2"/> <TextBox HorizontalAlignment="Center" Margin="10,10,0,0" Name="textBox2" VerticalAlignment="Top" Grid.Row="1" Grid.ColumnSpan="2"/> <TextBox HorizontalAlignment="Right" Margin="10,10,0,0" Name="textBox3" VerticalAlignment="Top" Grid.Row="2" Grid.Column="0"/> <TextBox HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox4" VerticalAlignment="Top" Grid.Row="2" Grid.Column="1"/> <Button HorizontalAlignment="Center" Margin="10,10,0,0" Name="button1" VerticalAlignment="Top" Grid.Row="3" Grid.ColumnSpan="2"> </Button> </Grid> </Window>
二、XAML中为对象属性赋值的方法
XAML是一种声明性语言,XAML会为每一个标签创建一个与之对于的对象,对象创建之后要对它的属性进行必要的初始化之后才有使用意义。因为XAML语言不能够编写程序的运行逻辑,所以一份XAML文档除了使用标签声明对象就是初始化对象属性了。注意: XAML中对对象赋值总共有两种方法: 1、:使用字符串进行简单赋值。 2、:使用属性元素(Property Element)进行复杂赋值 (使用TypeConverter类将XAML标签的Attribute与对象的Property进行映射)。
使用TypeConverter类将XAML标签的Attribute与对象的Property进行映射(TypeConverter
和 TypeConvertAttribute 这两个类)
(1)创建类Human,类型转换器TypeConvertAttribute
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; namespace WpfApplication1 { //类型转换器TypeConvertAttribute [TypeConverter(typeof(StringToHumanTypeConverter))] public class Human { public string Name{get;set;} public Human Child { get; set; } } }
(2)、从TypeConvert派生出自己的类,并重写它的ConverFrom方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; namespace WpfApplication1 { //首先,我们要从TypeConvert派生出自己的类,并重写它的ConverFrom方法。 //这个方法有一个参数名叫做Value,这个值就是XAML文档里面为其设置的值。我们要做的就是将这个值翻译成合适对象的值并赋值给对象的属性: public class StringToHumanTypeConverter : TypeConverter { public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { Human human = new Human(); human.Name = value as string; return human; } return base.ConvertFrom(context, culture, value); } } }
(3)XAML引用命名空间,调用类
引用命名空间:WpfApplication1
xmlns:local="clr-namespace:WpfApplication1"
Window.Resources 定义一个Window级的Resources ,这只是一种以Window级的资源的定义.
其实Resources的定义可以在每一个容器控件中,(或者是在每一个控件,在Template 中可以用到),像C#中变量的定义一样,Resource的定义的地方不同
也就决定它的作用范围,如:
Window.Resources它的作用范围就是在Window容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源
Grid.Resources它的作用范围就是在Grid容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源
以此类推....
请注意:Window不是最上层的"容器",最上层的应该是Appication ,所以Application.Resources 的作用范围更大(有人把Application.Resource叫作全局资源,所有在这个Application下的容器控件等都可以使用,常用来做一个应该程序的Skin ,其ResourceDictionary定义的资源也类似 )
(<<我眼里的XAML结构框架>>概括为:"一个Application下有多个Window ,一个Window下有一个Grid,一个Grid下有很多布局容器,这些容器里面有好子容器或控件 ,控件里面有Template,template里面又可以里Grid…… ")
(4)按钮事件
private void button1_Click(object sender, RoutedEventArgs e) { Human human = (Human)this.FindResource("human123"); MessageBox.Show(human.Child.Name); }
标记扩展:有一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做解析、生成相应的对象。
<TextBox Margin="5" Text="{Binding ElementName=slider1, Path=Value}" />
<Slider x:Name="slider1" Margin="5"/>
三、其他XAML语法
(1)引用外部库
clr-namespace:命名空间名称;assembly=外部*.dll
(2) 访问修饰符
<Window x:Class="WpfApplication1.MainWindow" x:ClassModifier="internal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Height="100" Width="100" x:FieldModifier="public"/>
</Grid>
</Window>
(3)属性元素
为属性赋予复杂对象。
<Button Height="100" Width="100" Content="OK">
<Button.Background>
<LinearGradientBrush>
<GradientStop Color="DarkGreen" Offset="0"/>
<GradientStop Color="LightGreen" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
(4) 附加属性
在WPF布局管理器类(Grid、DockPanel等)中 定位 UI元素
<Canvas>
<Button Canvas.Top="40"/>
</Canvas>
(5)标记扩展
XAML 解析器从专门的 外部类 中获取属性的值。这是非常有好处的,因为有些属性需要一些代码语句来计算其值。
前言:XAML有时需要一些标准功能或者默认行为无法满足的功能,比如属性赋值,它可能并不是直接赋一个字符串,而是要对已定义的对象的一个引用,由此便诞生了标记扩展。
标记扩展的语法是使用“{}”,例如 Map={bindingelementname=”myMap“}
标记扩展可分为以下几类:
a、基于WPF的标记扩展
StaticResource:通过引用已定义资源的值来为XAML属性提供值。
DynamicResource:通过将资源的引用推迟到运行时来为XAML属性提供值。动态资源引用强制来每次访问此类资源时都进行重新访问。
Binding:按引用于元素的数据上下文来为属性提供数据绑定值。
RelativeSource:在运行时,为了可以在元素树中定位若干可能关系的Binding提供源信息。
TemplateBinding:提供数据模板绑定。
b、XAML定义的标记扩展
x:Type:为所提供的类型提供Type对象。
x:Static:为属性值提供已定义的静态值。该静态值必须在引用之前定义。
x:Null:将null指定为XAML属性的值。
x:Array:为XAML中常规数组的创建提供支持
相关文章推荐
- Wpf 使用标签扩展为对象的属性赋值。
- mybatis 引用对象属性映射错误 or could not be found for the javaType (xxx.model) : jdbcType (null) combination.
- 无废话WPF系列3: XAML中为对象属性赋值
- WPF学习旅程(三)——在XAML中为对象的属性赋值
- XAML属性赋值转换之谜(WPF XAML语法解密)
- Wpf 对象属性赋值---属性标签
- WPF属性与特性的映射(TypeConverter)
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展
- XAML语法及标记扩展、附加属性、特定的字符和空白
- [ JS 进阶 ] 基本类型 引用类型 简单赋值 对象引用 (转)
- mx:states包含mx:AddChild 在切换时提示错误"TypeError: Error #1009: 无法访问空对象引用的属性或方法"的解决方法
- flex TypeError: Error #1009: 无法访问空对象引用的属性或方法
- 如何理解es6语法的,对象前面加三个点(...) 对象的解构赋值和扩展
- js基本类型 引用类型 简单赋值 对象引用
- 这个问题不简单:非静态的字段、方法或属性“System.Web.UI.Page.Request.get”要求对象引用
- c#语法糖代码——自动属性, 匿名类型,对象与集合初始化器,扩展方法
- TypeError: Error #1009: 无法访问空对象引用的属性或方法
- TypeError: Error #1009: 无法访问空对象引用的属性或方法。(解决)
- as3载入影片中TypeError:Error #1009:无法访问空对象引用的属性或方法
- js基本类型 引用类型 简单赋值 对象引用