2.XAML语言理解
XAML语言,发因(ZAMMEL),是用于实例化.net对象的标记语言
- 其目地是将图形表示与底层代码区分开以解决前端美工与后端程序员之间的分工合作的问题。
-
XAML基础知识
XAML将所有的元素映射为一个.net 实例类
- 顶级元素只包括:Application,Window,Page类
- 名称空间,类比于C#中的NameSpace 主要用于区分同名的类
- http://schemas.microsoft.com/winfx/2006/xaml/presentationWPF的核心名称空间,各种WPF中使用的类来源于此
- http://schemas.microsoft.com/winfx/2006/xaml的名称空间,用户解析xaml语言的相关
- 默认的名称空间和具体的类型并没有一一对应,而是建立一些通用的名称空间,将相关的类型包容进去
- 代码隐藏,WPF中使用x:Class=”JHT.XYYLClient.View.ChooseUser” 将XAML语言与后台代码建立关联
- 引入其他的名称空间
- 引入系统或自定义程序集:xmlns:sys=”clr-namespace:Microsoft.CSharp;assembly=System”
- 引入三方插件其他命名空间:xmlns:material=”http://materialdesigninxaml.net/winfx/xaml/themes“
XAMLAttribute赋值
XAML语言的Attribute的赋值,一个Attribute代表了一个实体的Property属性,
使用Attribute来赋值属性 使用TypeConverter类,将简单的数据转换成目的类型,如下:
//xaml语言
<Button Style="{StaticResource MaterialDesignFlatButton}" Foreground="#f5f5f5" Name="goBackTop" Command="{Binding GoBackCommand}" Visibility="{Binding ShowGoBackButton,Converter={StaticResource boolToVisi}}">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon VerticalAlignment="Center" Kind="LessThan" HorizontalAlignment="Center"></materialDesign:PackIcon>
<TextBlock Text="返回"></TextBlock>
</StackPanel>
</Button>
// 将bool值转换为可见枚举
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (null == value) return Visibility.Collapsed;
if (null != parameter && parameter.Equals("Reverse"))
return (bool) value ? Visibility.Collapsed : Visibility.Visible;
return (bool) value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
使用元素属性,赋值复杂的Property
<Grid>
<Grid.Background>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.0" Color="LightBlue"></GradientStop>
<GradientStop Offset="0.5" Color="AliceBlue"></GradientStop>
<GradientStop Offset="1.0" Color="CadetBlue"></GradientStop>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Grid.Background>
</Grid>
使用标记扩展进行赋值
- 标记扩展用于解决不希望使用固定值,而是希望动态的或与某个对象的属性一致的情况
- 标记扩展继承于MarkUpTypeExtension类,提供一个ProvideValue的方法
- 常用的标记扩展包含了如下:Static,Dymaic,Binding,Resoucres等
- 附加属性
- 用于多个控件,但是却定义在其他类的属性,例如:
。 - 附加属性可以充当一个可扩展的要素。
- 其原理是基于依赖属性来实现的。Grid.Row=0 可解释为 Grid.SetRow(stackPanel1,0)=stackPanel.SetValue(Grid.RowProperty,0);
- 属性设置事件,可以直接在属性中附加事件处理方法。
XAML名称空间详解
- x:Class
- 指定讲XAML标签的编译结果与后台代码中指定的类和并
- 只能用于根节点
- 指定的类必须使用partial关键字
- x:ClassModifier 指定编译生成的标签的访问控制级别,于类的修饰符’public’,’private’一致
- x:Name
- 告诉XAML编译器,当一个标签带有x:Name时,除了生成对应的实例,还会声明一个引用变量,其值为x:Name的值
- XAML标签所对应的对象有Name属性值,则也设为x:Name上,并注册到UI树上,以方便查找
- Name值是唯一的
- x:FieldModifier
- 字段属性修饰器,类比于类中字段的访问级别
- 默认访问级别为internal
- x:Key 将多次使用的内容提取出来放在资源字典里ResourecesDictonary
- 类比于MVC中的ViewBag等
- x:Shared
-
x名称空间中的标记扩展
x:Type 表示引用的是类型,大多数情况下,我们提供的是实例或是引用的类型,但不排除传递type类来传递
- x:Null 显示的对一个属性赋空值
- x:Array 像使用者暴露一个类型已知的ArrayList实例,该实例的类型,由Type指定
- x:Static 在xaml文档中使用静态数据
XAMl的编译
- XAML被编译成BAML,Viusal Studio 将所有的XAML语言编译成BAML,而嵌入Exe或Dll中
- 使用XamlReader对XAMl文件进行解析,该方法可用于动态创建用户界面,但是效率不高
- XAML的编译过程
- 第一阶段将xaml语言,编译成baml,存放在 \obj\Debug路径下 BAML是xaml的二级制表示,加载速度更快,效率更高
- 生成baml临时文件 MainWindow.baml
- 生成相关的临时类 MainWindow.g.cs
- 编译后的代码,将作为一个资源被嵌入到dll或exe文件中