自定义 WPF 控件的好处

Posted

技术标签:

【中文标题】自定义 WPF 控件的好处【英文标题】:Benefits of Custom WPF Controls 【发布时间】:2017-10-27 13:42:09 【问题描述】:

我已经彻底检查了自定义控件主题,花了几个小时研究其他人编写的自定义控件。我写了自己的自定义按钮,感觉更好。我已经阅读了所有关于“为什么要自定义控件”、“高级自定义控件示例”等的谷歌答案。

我的问题是,为什么?

我(或任何人)为什么要经历 9 圈地狱来创建自己的自定义控件,而我可以根据自己的需要调整现有控件(使用样式和模板)。实际上我在谷歌上没有找到任何解释,只有大量的例子,大部分来自听起来比我受教育程度更低的人。

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

【问题讨论】:

在网上搜索什么是oxyplot。你能用标准 wpf 控件的样式和模板来做这样的事情吗? 我编写的一个自定义控件是,例如,我们的“忙碌”微调器。它根据您给它的属性值生成路径数据。该模板具有路径和动画的东西。另一个是分支组合框(XAML 将其实现为重新模板化的菜单)。另一个是具有两个相邻列表框的东西之一,其中左侧有很多项目,用户将它们拖到右侧以选择它们,或使用<</>> 按钮。不过,在 WPF 中创建自定义控件相当简单,所以我想知道您是否没有看错文档。 【参考方案1】:

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

UIElement 或 FrameworkElement

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

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

控制

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

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

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

用户控制

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

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

其他一些控制

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

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

我本可以将该功能实现为附加属性而不是控件的扩展(也许我应该这样做),但它可以工作,并且我已经在三个不同的应用程序中使用了它(作为输出窗口和聊天日志)。所以,我很满意。


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

使按钮看起来不同的例子并不是你应该使用自定义控件的例子。它们只是为了教授过程细节而制作自定义控件的示例。如果您确实想要自定义按钮,只需自定义一个按钮即可。

【讨论】:

感谢您对事物的详细解释,它帮助我了解了基础知识。我相信我的主要问题是没有可以根据需要进行调整的代码,因此我需要从头开始编写它,这就是为什么它看起来很难的原因。总之,谢谢!

以上是关于自定义 WPF 控件的好处的主要内容,如果未能解决你的问题,请参考以下文章

wpf 自定义控件的自定义属性的数据绑定问题

wpf中动态添加的自定义控件过宽,不能完全显示,怎么办

WPF自定义控件の自定义控件

wpf 重新加载自定义控件出现异常

wpf 自定义控件combobox 依赖属性

[WPF自定义控件]从ContentControl开始入门自定义控件