2

我最近一直在通过创建自定义Component派生类来为一些不同的 WinForms 控件添加自定义功能,这些派生类只是包装Control,挂钩到所需的事件以执行额外的功能。

例如,我想在我的应用程序中为几个不同的控件添加拖放功能ListBox,所以我创建了一个DragAndDropListBoxComponent继承自Component该类的控件,然后将此新组件添加到我需要添加功能的表单中,设置DragAndDropListBoxComponentListBox属性到我想添加功能的列表框。

我喜欢这种扩展标准功能的方法,因为我可以为相同Control的内容创建多个自定义行为类型并将它们混合在一起以获得一些有趣的效果。这也有利于组合优于继承的原则。ComponentControl

我似乎花了一些时间来实现使用 Component 类列表这个。这部分是由于从未在网上看到它以这种方式使用 - 因此我的问题。自定义组件类是否常用这种方式?

4

1 回答 1

6

还有其他选项,您选择哪个选项并不重要,只要它能达到预期的结果,并且您不会觉得您的解决方案每时每刻都对您不利。

一种可能的替代方法是使用Extender Provider. Extender Provider 的一个优点是您似乎将“AllowDragAndDrop”属性添加到每个控件。(在您的情况下,该属性将仅添加到ListBox实例中)此新属性在设计时可见,因此其他使用者不必知道 DragAndDrop 功能的实现或位置详细信息,他们只需在PropertyGrid.

另一种可能的选择是使用装饰器模式。这例如在 .NET 流中使用:您有一个流,然后通过创建一个将旧流作为构造函数参数的新流来添加其他行为(缓冲、(解)压缩、加密......)。在您的情况下,您将 a 包裹ListBox在 a 中DragAndDropListBox。不过要小心,在这种特殊情况下,这种方法可能会给您带来更多麻烦而不是优势。

另一种可能的替代方法是从您要扩展的控件继承并将“CustomBehaviors”列表添加到控件。CustomBehaviors 将实现一些接口,允许您通过将接口的具体实例添加到集合中来向控件添加新行为。

于 2012-09-04T14:47:53.630 回答