自定义 WPF 控件的好处

Benefits of Custom WPF Controls

我彻底检查了自定义控件主题,花了几个小时研究其他人编写的自定义控件。我写了自己的自定义按钮,感觉更好。我已经阅读了围绕 "why custom controls"、"advanced custom controls examples" 等问题的所有 google 答案。

我的问题是,为什么?

为什么我(或任何人)要经历 9 个地狱循环来创建他自己的自定义控件,而一个人只能根据他的需要调整现有控件(使用样式和模板)。我实际上没有找到关于 google 的任何解释,只有大量的例子,大部分来自比我受教育程度更低的人。

我想有这样的需求,当谈论一些复杂的 DataGrid 时,我不知道,每个单元格都是一个按钮或其他东西(而且我仍然相信我可以用常规的 DataGrid 来做到这一点)...但我还没有发现比一个漂亮的按钮更复杂的东西。有没有人分享关于这个主题的复杂代码?

WPF 中有不同级别的元素自定义,具体取决于您从中扩展的内容 class。每个都有自己的用途,并且实现方式不同。从您的问题中不清楚您是在询问特定类型的控制还是一般的所有控制。所以,我会告诉你我对不同的看法。

UIElement 或 FrameworkElement

扩展 UIElement 为您提供最低级别的自定义控件,您可以在其中完全控制布局和呈现。 FrameworkElement 级别稍高,因为它为您完成了大部分常见的布局工作,同时还允许您覆盖它的关键部分。这些的主要思想是它们进行自己的渲染,而不是将其他元素组合在一起。

这些年来我制作了许多自定义的 FrameworkElements。一个例子是一把尺子,类似于您可能在 Photoshop 等程序中找到的尺子。它有一堆属性,可以定制它的显示方式,并显示指示鼠标相对于标尺的位置的标记(以及许多其他小的可选功能)。我在两个不同的专业项目中使用过它。我认为主要的好处是可以非常容易地插入并在任何需要的地方设置 properties/bindings。构建一次,反复使用。

控制

扩展 Control 引入了通过控件模板将多个 elements/controls 组合成一个可重用组件的概念。

我很少使用这个,但在适当的情况下仍然觉得它非常有价值。同样,这里的主要好处是可重用性。您创建一个控件,该控件具有对您想​​要执行的操作有意义的属性,然后将这些属性连接到它的控件模板中的控件属性。实际上,这与将新模板应用于现有控件是一样的,只是增加了能够定义您自己的依赖属性的功能。如果需要,您还可以在控件代码中执行自定义逻辑。

我可能误读了您的某些文字,但您似乎在暗示制作自定义控件比为现有控件制作控件模板要困难得多。我发现在使用这种方法的大多数情况下,两者几乎相同,唯一的区别是您是否有可以使用的代码。

用户控制

实际上,用户控件与自定义控件仅略有不同。只是,您无需定义控件模板,而是直接定义视觉内容。

这可能是最常见的自定义控件类型。它基本上是在 WPF 应用程序中制作基于 XAML 的内容的标准方法。这些可以像其他控件一样重复使用,但更适合单独使用,例如对话框的内容或 window 或特定于单个应用程序的其他内容。

一些其他控件

您还可以扩展现有控件以向其添加附加功能。这样,您仍然可以获得控件提供的所有功能,只需实现额外的位。

例如,我有一个名为 AutoScrollRichTextBox 的自定义控件,它扩展了 RichTextBox。所以,它做了 RichTextBox 能做的一切。它还可以在向文本框添加内容时自动滚动到底部(只有在添加内容之前文本框已经滚动到底部时才会这样做)。

我本可以将该功能实现为附加的 属性 而不是控件的扩展(也许我应该这样做),但它确实有效,而且我已经在三个不同的应用程序中使用了它(作为输出 window 并作为聊天记录)。所以,我很高兴。


最后,这真的只是您希望控件的独立性、可重用性和易用性的问题。如果已经有一个控件可以执行您想要的操作,而您只是想让它看起来不同,那么您绝对应该使用样式和模板来实现它。然而,如果你想做一些不存在的东西,限制自己只使用样式和模板将使实现工作更加困难,并使最终结果的可重用性降低,并且更难以设置额外的实例(除非所有实例都相同).

制作外观不同的按钮之类的示例并不是您应该使用自定义控件的示例。它们只是一些示例,说明某人将如何制作自定义控件以教授过程的细节。如果你真的想要一个自定义按钮,就自定义一个按钮。