行为:封装通用用户界面功能
获取行为支持:
- 安装Expression Blend
- System.Windows.Interativity.dll。定义支持行为的基本类。
- Microsoft.Expression.Inteactions.dll。通过添加可选的以核心行为类为基础的动作和触发器类
创建行为:
- 创建继承自Behavior基类的类
- 覆盖OnAttached()和OnDetaching()。
- 可以访问放置行为的元素(通过AssociatedObject属性),
- 调用OnAttached()方法关联事件处理程序。
- 调用OnDetaching()方法移除事件处理程序。
使用行为:
- 添加对定义类的类库以及System.Windows.Interactivity.dll程序集的引用
- 使用Interaction.Behaviors附加属性
控件模板
逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素。
可视化树,树中的每个节点代表可以在控件模板中定制的元素。
逻辑树指的是UI界面的组成元素的结构
可视化树是逻辑树的扩展版本,它将元素分成更小的部分。
System.Windows.LogicalTreeHelper提供了几个方法浏览逻辑树:
- FindLogicalNode():依靠名字查找指定元素,开始于指定元素,沿逻辑树向下搜索。
- BringIntoView():滚动容器(如果可能),使指定元素可见。
- GetParent():获得指定元素的父元素。
- GetChildren():获得指定元素的子元素。
VisualTreeHelper提供:GetChildrenCount(),GetChild(),和GetParent();
控件模板主要是用来改变控件的外观
数据模板则定义控件中数据的表现方式
控件模板:控件的外观通过ControlTemplate类型的对象确定,该对象指定了组成控件的显示的各种视觉元素。
有两部分:VistualTree视觉树,即是能看到的外观;Trigger触发器,里面包括外部条件达到某一条件下会引起的响应。
当WPF创建控件时,会创建控件类(模板父)的实例,然后实例化通过它的ControlTemplate设定的这个控件的外观树(组成这个控件的内部UI元素)。
开发自定义的简单控件模板
- 在Window的Resources中定义一个名字为myButtonTemplate的控件模板,并指定key标记
- 在使用StaticResource标记扩展为Button的Template属性赋值
- TemplateBinding将控件模板中的属性绑定到控件本身(模板父)
ContentPresenter对象
- ContentPresenter作为占位符,指定Content应该放置的位置;
- 从模板父获取实际的内容,绑定到自己的Content属性;
- 设置TargetType属性为模板父的类型。
五、触发器
- Trigger必须在ControlTemplate.Triggers的节点下;
- Triggers集合中可以包含任意数量的Trigger;
- 一个Trigger可以有任意数量的Setter;
- 每个Setter中指定三个属性,分别是TargetName、Property和Value。
实现:1 建立触发器ControlTemplate.Triggers 2 设置事件Trigger Property 3 改变属性Setter Property
组织模板资源:ResourceDictionary.MergedDictionaries的ResourceDictionary,Source
使用样式应用模板:设置Style的Setter Property为Control.Template,value为模板名,在容器上设置Style属性
自动应用模板:设置Style的TargetType为x:Type Button
动态更换皮肤:Application.Current.Resources.MergedDictionaries[0]重新赋值为ResourceDictionary实例
数据绑定
变更通知:
1.将所有的源属性更改为依赖属性。
2.为每个属性引发一个事件(如:porpertyNameChanged的事件)。
3.可以实现System.ComponentModel.INotifyPropertyChanged接口,需要名称为PropertyChanged的事件
绑定到对象集合:绑定对象:使用Binding关键字并指定ElementName和Path,就是指定源对象(Source)和源属性(Source Property).
- 常用标记:{Binding Path =””}
- 利用ItemsSource来绑定数据源
- 利用DataContext来作为共享数据源,DataContext就是数据上下文对象,它是为了避免多个对象共享一个数据源时重复的对所有对象显式地用binding标记每个Source/RelativeSource/ElementName。
- 启用集合跟踪,数据源必须实现INotifyCollectionChanged的接口,WPF提供ObservableCollection
针对于ItemsControl的绑定
- itemsSource 指定要显示的数据源
- DisplayMemberPath 指定源对象中被显示的属性。
- ItemTemplate 指定以什么样的格式来显示数据
- Path 数据源对象中的属性—控制显示
- DataContext 共享数据源