WPF控件开发之自定义控件(5)

 

尽可能减少帮助器元素所必需的、特定于用户的绑定或属性设置。通常,帮助器元素需要某些绑定或属性设置才能在控件模板中正确工作。帮助器元素和模板化控件应当尽可能多地生成这些设置。在设置属性或者建立绑定时,注意不要重写由用户设置的值。具体的最佳做法如下所示:

命名的帮助器元素应当由父级标识,而且父级应当针对帮助器元素建立任何必需的设置。

对于基于类型的帮助器元素,应当直接针对它们建立任何必需的设置。这样做可能需要帮助器元素查找它在使用时的信息上下文,包括其 TemplatedParent(它在使用时的模板的控件类型)。例如,在用于 ContentControl 派生类型时,ContentPresenter 会自动将它的 TemplatedParent 的 Content 属性绑定到它的 Content 属性。

独立帮助器元素不能按这种方式进行优化,这是因为按照定义,帮助器元素和父级不能相互识别。

使用 Name 属性来标记模板中的元素。如果控件需要在样式中查找某个元素才能以编程方式访问它,则该控件应当使用 Name 属性和 FindName 范例来进行查找。控件不应在未找到所需元素时引发异常,而是应在不提示的情况下禁用需要该元素的功能。

使用最佳做法来表示样式中的控件状态和行为。 下面按顺序列出了用来表示样式中的控件状态更改和行为的最佳做法。您应当使用列表上的第一项来实现您的方案。

属性绑定。示例:在 ComboBox..::.IsDropDownOpen 和 ToggleButton..::.IsChecked 之间绑定。

触发的属性更改或属性动画。示例:Button 的悬停状态。

命令。示例:ScrollBar 中的 LineUpCommand / LineDownCommand。

独立帮助器元素。示例:TabControl 中的 TabPanel。

基于类型的帮助器类型。示例:Button 中的 ContentPresenter 和 Slider 中的 TickBar。

命名的帮助器元素。示例:ComboBox 中的 TextBox。

命名帮助器类型中的冒泡事件。如果您侦听样式元素中的冒泡事件,则应当要求生成该事件的元素能够进行唯一标识。示例:ToolBar 中的 Thumb。

自定义 OnRender 行为。示例:Button 中的 ButtonChrome。

慎用样式触发器(与模板触发器相对)。会影响到模板中元素属性的触发器必须在模板中进行声明。会影响到控件属性(没有 TargetName)的触发器可以在样式中声明,除非您知道更改模板还可能会损坏触发器。

与现有的样式模式一致。 一个问题常常有多种解决办法。注意尽可能与现有的控件样式模式保持一致。这对于派生自同一基类型(例如,ContentControl、ItemsControl、RangeBase 等)的控件尤其重要。

在不重新模板化的情况下公开属性来启用常见自定义项方案。WPF 不支持可插入/可自定义的部件,因此控件用户只能使用两种自定义方法:直接设置属性或者使用样式设置属性。请记住,比较合适的做法是,设置数量有限的属性,使其面向极其常见的高优先级自定义项方案,否则的话,这些方案需要重新模板化。下面是有关何时以及如何启用自定义项方案的最佳方法:

极其常见的自定义项应当作为属性在控件上公开并由模板使用。

不太常见(尽管并非极少见)的自定义项应当作为附加属性公开并由模板使用。

需要对已知但是极少见的自定义项重新模板化,这一点也是可以接受的。

主题注意事项 
主题样式应当尝试在所有的主题之间具有一致的属性语义,但不保证能够实现这一点。作为控件文档的一部分,控件应当具有一个描述其属性语义(即控件属性的“含义”)的文档。例如,ComboBox 控件应当定义 Background 属性在 ComboBox 中的含义。控件的默认样式应当尝试遵循在其文档中的所有主题中定义的语义。另一方面,控件用户应当注意属性语义可能因主题而异。在某些情况下,给定的属性在由特定主题所需的可视化约束下可能无法表示 (例如,对于许多控件来说,传统主题没有可以向其应用 Thickness 的边框)。

主题样式不需要在所有的主题之间具有一致的触发器语义。由控件样式通过触发器或动画公开的行为可能因主题而异。控件用户应当注意到,控件将不必使用同一个机制在所有的主题中实现一个特定的行为。例如,一个主题可以使用动画来表示悬停行为,而另一个主题则可以使用触发器。这可能会导致自定义控件上的行为保留出现不一致现象 (例如,如果控件的悬停状态是使用触发器来表示的,那么,更改背景属性可能不会影响该状态)。但是,如果悬停状态是使用动画来实现的,那么,更改背景属性可能会不可挽回地中断动画,从而中断状态过渡)。

主题样式不需要在所有的主题之间具有一致的“布局”语义。例如,默认的样式不需要保证控件将在所有的主题中占用同样的大小,也不需要保证控件将在所有的主题中具有同样的内容边距/空白。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值