《深入浅出WPF》读书笔记之——XAML篇(3)

时间:2024-10-02 07:24:34

1、wpf程序引用的x名称空间:/winfx/2006/xaml,它包含的类多与解析xaml语言相关,可称为xaml名称空间。

2、xaml也有自己的编译器,xaml语言被解析并编译,最终形成IL(微软中间语言)存储在assembly中

3、x名称空间包含的工具

名称

种类(在xaml中出现的形式)

解释

常用程度

x:Array

标签扩展

构建一个ArrayList实例,参照下方代【码片段01

不太常用

x:Class

Attribute

告诉xaml编译器将xaml标签的编译结果和code-behind代码中指定的类进行合并

1、只能用于根节点,如<Window>、<UserControl>

2、根节点类型和x:Class指示的类型一直

3、x:Class指示的类必须使用partial关键字

常用

x:ClassModifier

Attribute

指示xaml编译生成的类的访问级别,如public、internal

1、要配合x:Class使用

2、x:ClassModifier的值必须和partial类的访问控制级别一致

3、x:ClassModifier的值随着后台语言(C#,VB,F#)的不同而不同

不太常用

x:Code

XAML指令元素

参照《XAML篇(2)》中的x:Code代码示例,其实基本没用

基本没用

x:FieldModifier

Attribute

针对x:Name声明的变量,设置它的访问控制级别,前提是也使用x:Name,如果没有设置Name或者x:Name,编译会报错

不太常用

x:Key

Attribute

一般用在Resource Dictionary中,用作检索的索引

常用

x:Name

Attribute

1、为xaml编译生成的对象声明一个引用变量,变量名就是x:Name的值

2、将对象的Name属性(如果有),也设置为x:Name的值,并把这个值注册到UI树上,以方便查找

3、有些元素没有Name属性,如果考虑统一性和可读性,建议全部使用x:Name,否则可以使用Name属性(其实没多大差别)

常用

x:Null

标签扩展

为属性赋空值

不太常用

x:Shared

Attribute

1、一定要和x:Key配合使用

2、true:每次使用资源都是同一个对象,false:每次使用资源是这个对象的一个新副本

3、xaml编译器默认为资源添加x:Shared="true"

不太常用

x:Static

标签扩展

1、为xaml属性直接赋值一个static对象

2、在国际化时可以使用static属性,当然国际化也可以使用dynamic resource引用Resource Dictionary的字符串资源

3、为radiobutton传递枚举参数,参照【代码片段02

常用

x:Subclass

Attribute

用于不支持partial关键字的语言(如F#)

基本不用

x:Type

标签扩展

为Type属性指定一个值,参照【代码片段03

常用

x:TypeArguments

Attribute

在xaml中为泛型类提供类型参数,只能用于根元素

基本不用

x:Uid

Attribute

独立于x:Name,主要用于国际化,详细参照:

/en-us/dotnet/framework/xaml-services/xaml-namespace-x-language-features

不太常用

x:XData

XAML指令元素

配合XamlDataProvider,提供xml数据作为数据源,参照【代码片段04

不太常用,不过可以在UI测试时使用

标签扩展:在使用要包含在花括号{}内部使用,是MarkupExtension类的直接或间接派生类

Attribute:直接在元素的Attribute使用

XAML指令元素:告诉编译器这是一段指令或代码

 

x空间全部以及xaml 2009包含的语言特性参照: 

/en-us/dotnet/framework/xaml-services/xaml-namespace-x-language-features

/en-us/dotnet/framework/xaml-services/xaml-2009-language-features

 


代码片段01:

  1. <>
  2. <x:Array x:Key="testArray" Type="{x:Type sys:String}">
  3. <sys:String>Test String1</sys:String>
  4. <sys:String>Test String2</sys:String>
  5. <sys:String>Test String3</sys:String>
  6. <sys:String>Test String4</sys:String>
  7. </x:Array>
  8. </>
  9. <Grid>
  10. <ComboBox
  11. Width="200"
  12. VerticalAlignment="Center"
  13. ItemsSource="{StaticResource testArray}"
  14. SelectedIndex="0" />
  15. </Grid>

显示效果:


代码片段02

  1. <>
  2. <local:GenderToCheckedConverter x:Key="GenderToCheckedConverter" />
  3. </>
  4. <Grid>
  5. <StackPanel
  6. HorizontalAlignment="Center"
  7. VerticalAlignment="Center"
  8. Orientation="Horizontal">
  9. <RadioButton Content="男" IsChecked="{Binding GenderValue, Mode=TwoWay, Converter={StaticResource GenderToCheckedConverter}, ConverterParameter={x:Static local:}}" />
  10. <RadioButton Content="女" IsChecked="{Binding GenderValue, Mode=TwoWay, Converter={StaticResource GenderToCheckedConverter}, ConverterParameter={x:Static local:}}" />
  11. </StackPanel>
  12. </Grid>
  1. public enum Gender
  2. {
  3. Male,
  4. Female
  5. }
  6. public class GenderToCheckedConverter : IValueConverter
  7. {
  8. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  9. {
  10. Gender gender = (Gender)value;
  11. Gender parameterGender = (Gender)parameter;
  12. return gender == parameterGender;
  13. }
  14. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  15. {
  16. bool isChecked = (bool)value;
  17. if (isChecked)
  18. {
  19. return (Gender)parameter;
  20. }
  21. else
  22. {
  23. return null;
  24. }
  25. }
  26. }

 


代码片段03

  1. <Style TargetType="{x:Type TextBlock}">
  2. <Setter Property="Foreground" Value="Red"></Setter>
  3. <Setter Property="VerticalAlignment" Value="Center"></Setter>
  4. <Setter Property="HorizontalAlignment" Value="Center"></Setter>
  5. <Setter Property="FontSize" Value="20"></Setter>
  6. </Style>
  7. 也可以写成:
  8. <Style TargetType="TextBlock">
  9. <Setter Property="Foreground" Value="Red"></Setter>
  10. <Setter Property="VerticalAlignment" Value="Center"></Setter>
  11. <Setter Property="HorizontalAlignment" Value="Center"></Setter>
  12. <Setter Property="FontSize" Value="20"></Setter>
  13. </Style>
  14. ______________________________________________________________________________________________________________________________________________
  15. <Border
  16. Width="300"
  17. Height="200"
  18. BorderBrush="Red"
  19. BorderThickness="1">
  20. <TextBox
  21. HorizontalAlignment="Center"
  22. VerticalAlignment="Center"
  23. BorderBrush="{Binding BorderBrush, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TypeName=Border}}}"
  24. BorderThickness="1"
  25. Text="test text" />
  26. </Border>

代码片段04

 

  1. <>
  2. <XmlDataProvider x:Key="TestData" XPath="/Root">
  3. <x:XData>
  4. <Root xmlns="">
  5. <Student Name="test1Name" />
  6. <Student Name="test2Name" />
  7. </Root>
  8. </x:XData>
  9. </XmlDataProvider>
  10. </>
  11. <Grid>
  12. <ListBox
  13. Width="200"
  14. Height="200"
  15. HorizontalAlignment="Center"
  16. VerticalAlignment="Center"
  17. ItemsSource="{Binding Source={StaticResource TestData}, XPath=Student/@Name}" />
  18. </Grid>