我已经彻底检查了自定义控件主题,花了几个小时研究其他人编写的自定义控件。我已经编写了自己的自定义按钮,感觉更好。我已经阅读了围绕"为什么自定义控件","高级自定义控件示例"等等。
我的问题是,为什么?
为什么我(或任何人)可以通过9个地狱圈来创建自己的自定义控件,当人们可以根据自己的需要调整现有控件时(使用样式和模板)。我实际上没有在谷歌上找到任何解释,只有大量的例子,大多数来自那些听起来比我受教育程度低的人。
我想有这样的需要,在谈论一些复杂的DataGrid时,我不知道,每个单元格都是一个按钮或者其他东西(我仍然认为我可以使用常规的DataGrid来实现)...但我没有找到比美丽按钮更复杂的东西。没有人在这个主题上分享复杂的代码吗?
答案 0 :(得分:0)
WPF中有不同级别的元素自定义,具体取决于您从哪个类扩展。每个都有自己的用途,并以不同的方式实现。从您的问题中不清楚您是否询问特定类型的控制或一般性的所有控制。所以,我会告诉你我对不同的看法。
UIElement或FrameworkElement
扩展UIElement
为您提供最低级别的自定义控件,您可以完全控制布局和渲染。 FrameworkElement
略高,因为它可以为您提供大多数常见布局,同时还允许您覆盖它的关键部分。这些主要思想是他们自己渲染而不是将其他元素组合在一起。
多年来,我已经制作了许多自定义FrameworkElements。一个例子是类似于像Photoshop这样的程序中可能找到的标尺。它具有一系列属性,可以自定义显示方式以及显示相对于标尺的鼠标位置的标记(以及许多其他一些可选功能)。我在两个不同的专业项目中使用过它。我认为主要的好处是它非常容易插入并在任何需要的地方设置属性/绑定。构建一次,一遍又一遍地使用它。
<强>控制强>
扩展Control
引入了通过控件模板将多个元素/控件合成为一个可重用组件的概念。
我不经常使用这个,但在适当的情况下仍然觉得非常有价值。同样,这里的主要好处是可重用性。您创建一个控件,其属性对您想要执行的操作有意义,然后将这些属性连接到其控件模板中控件的属性。实际上,这与将新模板应用于现有控件相同,增加的功能是能够定义自己的依赖项属性。如果需要,您还可以在控件代码中执行自定义逻辑。
我可能会误读你的一些文字,但你似乎暗示制作自定义控件比为现有控件制作控件模板要困难得多。我发现在大多数情况下使用这种方法两者几乎相同,唯一的区别在于你是否有一个可以使用的代码。
用户控制
实际上,用户控件实际上只与自定义控件略有不同。只是,您可以直接定义可视内容,而不是定义控件模板。
这可能是最常见的自定义控件类型。它基本上是在WPF应用程序中制作基于XAML的内容的标准方法。这些可以像其他控件一样重复使用,但更适合单次使用,例如对话框或窗口的内容或特定于单个应用程序的其他内容。
其他一些控制
您还可以扩展现有控件以向其添加其他功能。这样,您仍然可以获得控件提供的所有功能,并且只需实现附加位。
例如,我有一个名为AutoScrollRichTextBox
的自定义控件,可以扩展RichTextBox
。因此,它完成了RichTextBox
可以做的所有事情。当内容添加到文本框时,它还能够自动滚动到底部(只有在添加内容之前文本框已经滚动到底部时才会自动滚动到底部。)
我本可以将该功能实现为附加属性而不是控件的扩展(也许我应该有),但它可以工作,我已经在三个不同的应用程序中使用它(作为输出窗口和聊天日志)。所以,我很高兴。
最后,它实际上只是一个自包含,可重复使用和易于插入的问题,你想要一个控件。如果已经有一个控件可以完成您想要的操作,而您只是希望它看起来与众不同,那么您一定要使用样式和模板来实现这一点。但是,如果您想创建一些尚不存在的东西,限制自己只使用样式和模板将使实现更加困难,并使最终结果不再可重用,并且更难以设置其他实例(除非所有实例都相同) )。
制作看起来不同的按钮之类的示例并不是您应该使用自定义控件的示例。它们只是某人如何为了教授过程细节而制作自定义控件的例子。如果您确实需要自定义按钮,只需自定义一个按钮。