天天看点

控件自定义

控件自定义

http://msdn.microsoft.com/zh-cn/library/ms752043.aspx

WPF 提供三个用于创建控件的一般模型,每个模型都提供不同的功能集和灵活度。 这三个模型的基类分别为UserControl、Control 和 FrameworkElement。

如果控件继承自 UserControl,则使用该控件的用户将无法使用DataTemplate 或ControlTemplate 来自定义其外观。

如果符合以下任一情况,请考虑从 Control 派生,而不要使用UserControl 类: 希望控件外观能通过ControlTemplate 进行自定义。 希望控件支持不同的主题。

从 UserControl 或Control 派生的控件依赖于组合现有元素。 但是,某些时候,简单的元素组合不能满足控件的外观需要。 对于这些情况,使组件基于 FrameworkElement 才是正确的选择。

当属性为依赖项属性时,可以进行下面的操作:

在样式中设置该属性。

将该属性绑定到数据源。

使用动态资源作为该属性的值。

动画处理该属性。    

下面的示例通过执行以下操作定义一个名为 Value 的依赖项属性:

将一个名为 ValueProperty 的 DependencyProperty 标识符定义为 publicstaticreadonly 字段。

通过调用 DependencyProperty.Register 向属性系统注册该属性名

通过实现该属性的 get 和 set 访问器定义一个名为 Value(即用来注册该依赖项属性的名称)的 CLR 包装属性。get 和 set 访问器只是分别调用 GetValue 和 SetValue。

为 CoerceValueCallback 定义一个名为 CoerceValue 的方法。

为 PropertyChangedCallback 定义一个名为 OnValueChanged 的方法。 

路由事件支持以下行为:

事件可以在多个控件的父级上进行处理。

路由事件可在 EventSetter 中使用,应用程序开发人员通过 EventSetter 可以在样式内指定事件的处理程序。

路由事件可在 EventTrigger 中使用,这对于使用 XAML 对属性进行动画处理很有用。

通过执行以下操作定义了一个路由事件:              

将一个名为 ValueChangedEvent 的 RoutedEvent 标识符定义为 publicstaticreadonly 字段。

通过调用 EventManager.RegisterRoutedEvent 方法注册该路由事件。

声明一个名为 ValueChanged 的公共事件,并包含事件访问器声明.该示例调用 add 访问器声明中的 AddHandler 和 remove 访问器声明中的 RemoveHandler 来使用 WPF 事件服务。                

创建一个名为 OnValueChanged 的受保护的虚方法,该方法引发 ValueChanged 事件。                  

应按照以下原则在自定义控件上实现附加属性:

具有一个使用 RegisterAttached 方法创建的 publicstaticreadonlyDependencyProperty,其形式为“属性名称Property”。

实现一对名为 Set属性名称 和 Get属性名称 的 public static CLR 方法。 这两种方法都应接受从 DependencyProperty 派生的类作为其第一个参数。 

Set 属性名称 和 Get属性名称 必须分别直接路由到目标依赖项对象的 GetValue 和 SetValue 方法。