声明一个名为 ValueChanged 的公共事件,并包含事件访问器声明。该示例调用 add 访问器声明中的 AddHandler 和 remove 访问器声明中的 RemoveHandler 来使用 WPF 事件服务。
创建一个名为 OnValueChanged 的受保护的虚方法,该方法引发 ValueChanged 事件。
使用绑定
若要将控件 UI 与其逻辑分离,请考虑使用数据绑定。如果是使用 ControlTemplate 定义控件的外观,这一点尤其重要。使用数据绑定时,可能能够避免引用 UI 的特定部分。
下面的示例更新 NumericUpDown 控件的 TextBlock,向它分配一个名称,然后在代码中按名称引用该文本框。
下面的示例使用绑定来达到相同的目的。
针对设计器设计
若要在 Visual Studio Windows Presentation Foundation (WPF) 设计器中获得对自定义 WPF 控件的支持(例如,使用“属性”窗口编辑属性),请遵循以下准则。
依赖项属性
确保实现 CLRget 访问器和 set 访问器,如前面“使用依赖项属性”中所述。设计器可以使用包装来检测某个依赖项属性是否存在,但与 WPF 和控件客户端一样,在获取或设置属性时不需要使用设计器来调用访问器。
附加属性
应按照以下原则在自定义控件上实现附加属性:
具有一个使用 RegisterAttached 方法创建的 publicstaticreadonlyDependencyProperty,其形式为“属性名称Property”。传递到 RegisterAttached 的属性名称必须与属性名称 匹配。
实现一对名为 Set属性名称 和 Get属性名称 的 public static CLR 方法。这两种方法都应接受从 DependencyProperty 派生的类作为其第一个参数。Set属性名称 方法还接受其类型与属性的注册数据类型匹配的参数。Get属性名称 方法应返回相同类型的值。如果缺少 Set属性名称 方法,则该属性标记为只读。
Set 属性名称 和 Get属性名称 必须分别直接路由到目标依赖项对象的 GetValue 和 SetValue 方法。通过调用方法包装或直接调用目标依赖项对象,设计器可以访问附加属性。
创建 UserControl
如前所述,在 WPF 中创建控件的最简单方法是从 UserControl 派生。下面的示例演示用于定义 NumericUpDownUserControl 的 用户界面 (UI) 的 XAML:
如此示例所示,自定义 UserControl 的开发模型非常类似于用于应用程序开发的模型。
创建自定义控件
生成支持模板的控件
UserControl 提供了一种简单方法在 WPF 中生成可重用的功能,但要利用模板化和支持不同主题,则要使用的模型为 Control。本节将上一节中的 UserControl 示例转换为自定义 Control。
更改基类
首先,将 UserControl 基类替换为 Control。
移动到模板
一旦更新了基类,则需要将控件的内容移动到模板。模板在可位于应用程序中的很多位置的样式中定义。对于此示例,样式位于应用程序资源中。
在 UserControl 示例中,TextBlock 和 RepeatButton 实例已指定了名称。RepeatButton 实例还引用了代码中定义的事件处理程序。可以在此自定义 Control 中移除这两个实例,因为将通过更松散耦合的方式,改为使用绑定和命令来获取相同的行为。
然后,模板中的元素可以引用这些命令,如下面的示例所示。
为 Windows 主题提供支持
一个控件在大量不同 WPF主题中可能有不同的外观。若要支持多个主题,必须使用控件所需的正确样式、模板和其他资源来定义主题文件。还需要将 ThemeInfoAttribute 属性 (Attribute) 的 ThemeDictionaryLocation 属性 (Property) 设置为引用源程序集,如下面的示例所示。
尽可能减少帮助器元素所必需的、特定于用户的绑定或属性设置。通常,帮助器元素需要某些绑定或属性设置才能在控件模板中正确工作。帮助器元素和模板化控件应当尽可能多地生成这些设置。在设置属性或者建立绑定时,注意不要重写由用户设置的值。具体的最佳做法如下所示:
命名的帮助器元素应当由父级标识,而且父级应当针对帮助器元素建立任何必需的设置。
对于基于类型的帮助器元素,应当直接针对它们建立任何必需的设置。这样做可能需要帮助器元素查找它在使用时的信息上下文,包括其 TemplatedParent(它在使用时的模板的控件类型)。例如,在用于 ContentControl 派生类型时,ContentPresenter 会自动将它的 TemplatedParent 的 Content 属性绑定到它的 Content 属性。
独立帮助器元素不能按这种方式进行优化,这是因为按照定义,帮助器元素和父级不能相互识别。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-4819-3.html
房价不降
下课了吧