gpt4 book ai didi

c# - 使用自定义组件包装器而不是继承来扩展 WinForm 控件是常见做法吗?

转载 作者:行者123 更新时间:2023-12-02 14:24:33 26 4
gpt4 key购买 nike

我最近通过创建自定义 Component 向一些不同的 WinForms 控件添加自定义功能。派生类仅包装 Control , Hook 所需的事件来执行额外的功能。

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

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

我似乎花了一段时间才意识到使用 Component 类列表 this 的实现。这部分是因为从未在网上看到它以这种方式使用——因此我提出了问题。自定义组件类常用这种方式吗?

最佳答案

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

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

另一种可能的替代方案是使用 Decorator pattern 。例如,这在 .NET 流中使用:您有一个流,然后通过创建一个将旧流作为构造函数参数的新流来添加其他行为(缓冲、(解)压缩、加密等)。在您的情况下,您可以将 ListBox 包装在 DragAndDropListBox 中。但要小心,在这种特殊情况下,这种方法可能会给您带来更多的麻烦,而不是带来的好处。

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

关于c# - 使用自定义组件包装器而不是继承来扩展 WinForm 控件是常见做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com