WPF笔记

1、XAML文件的根对象元素必须指定至少一个XML命名空间,用于验证自己和子元素。你可以(在根元素或子元素上)声明额外的XML命名空间,但每一个命名空间下的标识符都         必须有一个唯一的前缀,例如,WPF的XAML文件都会使用第二个命名空间加上前缀x(记作xmlns:x而不仅仅是xmlns):

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"


2、类型+命名空间+属性


3、属性示例:

属性元素语法:

  1. <Window x:Class="Wpftest.MainWindow"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="MainWindow" Height="350" Width="525">  
  5.     <Grid>  
  6.         <Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">  
  7.             <Button.Content>  
  8.                 <Rectangle Height="40" Width="40" Fill="Black"/>  
  9.             </Button.Content>  
  10.         </Button>  
  11.     </Grid>  
  12. </Window>  

  1. <Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">  
  2.             <Button.Content>  
  3.                 OK  
  4.             </Button.Content>  
  5.             <Button.Background>  
  6.                 yellow  
  7.             </Button.Background>  
  8.         </Button>  

4、类型转换器

WPF提供了许多常用数据类型的类型转换器,如Brush、Color、FontWeight、Point等,它们都是派生自TypeConverter的类(如
BrushConverter、ColorConverter等),你也可以为自定义的数据类型写类型转换器。与XAML语言不同,类型转换器通常支持不区分大小写的字符串。
如果没有Brush类型转换器,你就必须使用属性元素语法来设置XAML中的Background属性,如下所示:

  1. <Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Content="OK">  
  2.     <Button.Background>  
  3.         <SolidColorBrush>  
  4.             <SolidColorBrush.Color>  
  5.                 <Color A="255" R="255" G="255" B="255"/>  
  6.             </SolidColorBrush.Color>  
  7.         </SolidColorBrush>  
  8.         <SolidColorBrush Color="White"/>  
  9.     </Button.Background>  
  10. </Button>  


5、标记扩展

只要特性值由花括号({})括起来,XAML编译器或解析器就会把它认作一个标记扩展值而不是一个普通的字符串(或其他一些需要进行类型转换的东西)

下面的按钮使用了3个不同的标记扩展类型,其中分别用到了3个不同的特性:

  1. <Button xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  2.         xmlns: x="http://schemas.microsoft.com/winfx/2006/xaml"  
  3.         Background="{x:Null}"  
  4.         Height="{x:Static SystemParameters.IconHeight}"  
  5.         Content="{Binding Path=Height, RelativeSource={RelativeSource Self}}"/>  
属性元素语法的表达形式:

  1. <Button xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  2.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  
  3.     <Button.Background>  
  4.         <x:Null/>  
  5.     </Button.Background>  
  6.     <Button.Height>  
  7.         <x:Static Member="SystemParameters.IconHeight" />  
  8.     </Button.Height>  
  9.     <Button.Content>  
  10.         <Binding Path="Height">  
  11.             <Binding.RelativeSource>  
  12.                 <RelativeSource Mode="Self"/>  
  13.             </Binding.RelativeSource>  
  14.         </Binding>  
  15.     </Button.Content>  
  16. </Button>  

每个花括号中的第一个识别符是标记扩展类的名称。按照惯例,这样的类都以Extension后缀结尾,但是当你在XAML中使用它时,可以不用该后缀。在这个例子中,NullExtension(我们看到的是x:Null)和StaticExtension(我们看到的是x:Static)是System.Windows.Markup命名空间的类, 因此必须使用前缀x来定位它们。Binding( 没有Extension后缀) 是在System.Windows.Data命名空间下的,因此在默认的XML命名空间下就可以找到它。

***如果你曾经需要设置一个属性特性值为字面值字符串(以左花括号开始),就必须摆脱它以免把它作为标记扩展。我们可以通过在其之前增加一对空花括号来实现。例如:

如在上例中,将Content改为     Content="{}{This is not a markup extension}"或者用属性元素语法


6、XAML扩展类型(对象元素的子元素)

WPF 程序集都被加上了XmlnsDefinitionAttribute属性,这样可以将.NET命名空间映射为XAML文件中的XML命名空间。

为了处理那些不是专门为XAML设计的程序集的类型,需要使用一个特殊的指令作为XML命名空间,例:

  1. <collections:Hashtable  
  2.     xmlns:collections="clr-namespace:System.Collections;assembly=mscorLib"  
  3.     xmlns:sys="clr-namespace:System;assembly=mscorLib"    
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  
  5.     <sys:Int32 x:Key="key1">7</sys:Int32>  
  6.     <sys:Int32 x:Key="key2">23</sys:Int32>  
  7. </collections:Hashtable>  
clr-namespace标记允许直接在XAML中放入一个.NET命名空间。仅当需要的类型不在相同的程序集(XAML编译后生成的)中时,最后的程序集规范才是必须的。一般使用程序集的简单名称(如mscorlib)。但你可以使用规范的呈现方式,它是由System.Reflection.Assembly.Load提供支持的(虽然不允许空格),该函数包含了额外的信息,如版本或公共密钥令牌。

这个例子有两个关键点强调了不仅与.NET类型系统进行整合,也要与.NET Framework基类库中的特定类型进行整合。

子元素可以使用标准的XAML x:Key语法添加到父Hashtable中,因为Hashtable和.NETFramework中的其他集合类从1.0版本开始就实现了IDictionary接口。

之所以可以这么直接使用System.Int32,是因为类型转换器已经存在,且类型转换器是支持将字符串转换为整型的。因为XAML支持的类型转换器都是派生自System.ComponentModel.TypeConverter的类,这个类从.NET Framework 1.0开始就有了。这其实也是Windows Forms使用的类型转换机制(例如,允许在Visual Studio的属性格中输入字符串,并将它们转换为适当的类型)。

规则:

(1) 如果该类型实现了IList接口,就为每个子元素调用IList.Add。
(2) 否则,如果该类型实现了IDictionary,就为每个子元素调用IDictionary.Add,在该值的键和元素中使用x:Key特性值。
(3) 否则,如果父元素支持内容属性(由System.Windows.Markup.ContentPropertyAttribute表示),而且子元素的类型与该内容属性是兼容的,就把子元素作为它的值。
(4) 否则,如果子对象是普通文本,且有类型转换器将子对象转换为父类型(没有在父元素上设置属性),则把子元素作为类型转换器的输入,将输出作为父对象的实例。
(5) 其他情况下,则抛出一个错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值