自定义控件从UserControl 继承与从Control 继承的比较

从 UserControl 派生

在 WPF 中创建控件的最简单方法是从 UserControl 派生。如果生成继承自 UserControl 的控件,需要将现有组件添加到 UserControl,命名这些组件,然后在 可扩展应用程序标记语言 (XAML) 中引用事件处理程序。执行这些操作之后,即可在代码中引用这些命名元素和定义事件处理程序。此开发模型非常类似于用于 WPF 应用程序开发的模型。

如果生成正确,UserControl 可以利用丰富内容、样式和触发器的优点。但是,如果控件继承自 UserControl,则使用该控件的用户将无法使用 DataTemplateControlTemplate 来自定义其外观。因此,有必要从 Control 类或其派生类(UserControl 除外)进行派生,以便创建支持模板的自定义控件。

从 UserControl 派生的优点

如果符合以下所有情况,请考虑从 UserControl 派生:

  • 希望以类似于生成应用程序的方式生成控件。

  • 控件仅由现有组件组成。

  • 不需要支持复杂自定义项。

从 Control 派生

Control 类派生是大多数现有 WPF 控件使用的模型。在创建继承自 Control 类的控件时,可使用模板定义其外观。通过这种方式,可以将运算逻辑从可视化表示形式中分离出来。通过使用命令和绑定(而不是事件)并尽可能避免引用 ControlTemplate 中的元素,也可确保分离 UI 和逻辑。如果控件的 UI 和逻辑正确分离,该控件的用户即可重新定义其 ControlTemplate,从而自定义其外观。尽管生成自定义 Control 不像生成 UserControl 那样简单,自定义 Control 还是提供了最大的灵活性。

从 Control 派生的优点

如果符合以下任一情况,请考虑从 Control 派生,而不要使用 UserControl 类:

  • 希望控件外观能通过 ControlTemplate 进行自定义。

  • 希望控件支持不同的主题。

从 FrameworkElement 派生

UserControlControl 派生的控件依赖于组合现有元素。很多情况下,这是一种可接受的解决方案,因为从 FrameworkElement 继承的任何对象都可以位于 ControlTemplate 中。但是,某些时候,简单的元素组合不能满足控件的外观需要。对于这些情况,使组件基于 FrameworkElement 才是正确的选择。

生成基于 FrameworkElement 的组件有两种标准方法:直接呈现和自定义元素组合。直接呈现涉及的操作包括:重写 FrameworkElementOnRender 方法,并提供显式定义组件视觉效果的 DrawingContext 操作。此方法由 ImageBorder 使用。自定义元素组合涉及的操作包括使用 Visual 类型的对象组合组件的外观。有关示例,请参见使用 DrawingVisual 对象Track 是 WPF 中使用自定义元素组合的控件示例。在同一控件中,也可以混合使用直接呈现和自定义元素组合。

 

从 FrameworkElement 派生的优点(这种情况本文不讨论,只做列举)

如果符合以下任一情况,请考虑从 FrameworkElement 派生:

  • 希望对控件的外观进行精确控制,而不仅仅是简单的元素组合提供的效果。

  • 想要通过定义自己的呈现逻辑来定义控件的外观。

  • 想要以一种 UserControlControl 之外的新颖方式组合现有元素。

比较:

二者主要差别在于,继承自 UserControlNumericUpDown 不使用 ControlTemplate,而直接继承自 Control 的控件则相反。换句话说,使用 ControlTemplate 的控件具有可自定义的外观,而继承自 UserControl 的控件则没有。当然也许我们也可以让我们的控件继承自 UserControl ,然后通过其他替代手段实现自定义的外观,遗憾的是,几乎可以肯定的说那一定更复杂.

 

部分内容引自:http://msdn.microsoft.com/zh-cn/library/ms745025.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值