要为新的自定义控件扩展的内容
本文关键字:扩展 自定义控件 | 更新日期: 2023-09-27 18:27:15
有些人建议只扩展Panel
但我也知道UserControl
听起来像是我应该扩展的东西来控制自己。
Panel
vs. UserControl
vs. Control
vs. another_alternative
// inheritance depth:
Control
Panel : ScrollableControl : Control
UserControl : ContainerControl : ScrollableControl : Control
我所需要的只是一个矩形来绘制和完整的WinApi功能(Handle,WndProc等(。但我想避免所有可能出现在剧中的附加内容。我想使用我的自定义控件将它们添加到标准窗体中。没有极端的行为。
另一方面,UserControl扩展了ContainerControl,它可能具有我想要的功能(我不确定(。
我从
Control
继承了一个OpenGL盒子和其他一些简单的控件。到目前为止,它们工作正常。我没有注意到任何功能损失。有什么东西反对Control
吗?(以防我不需要任何额外的功能(
我认为非官方和公认的"标准"只是从UserControl
继承。至少这是我在其他任何地方看到的。不过,这并不能使它成为正确的事情!
另一方面,我认为您可能也太关心在这里做的"正确的事情"。对我来说,这几乎类似于过早优化。你要确保明智地使用你的资源。
还要记住,这样的事情以后总是可以更改的。
如果您出于某种原因担心,我肯定会选择继承深度最低的最简单的控件。
大多数情况下,UserControl
是最好的继承类。另一种选择是从我们要自定义的类继承。
在您的情况下,Panel
应该是要继承的最佳类,因为它是可以满足您的要求的最简单的控件类。
Panel
在这里是理想的,因为您没有为控件定义布局。它也不需要ControlTemplate
.自定义渲染方案通常附带使用 Panel
的建议。虽然Control
是你可以得到的最简单的"布局"元素,但Panel
可以在以后需要时托管子控件。完善!
在"Pro WPF"一书中,有关于UserControl
与ContentControl
的确切区别的描述,该书提供了比MSDN更多的信息。这是该部分的直接链接:
http://books.google.ca/books?id=znAVMHNSen0C&pg=PA518&lpg=PA518&dq=%22taking+a+closer+look+at+user+controls%22&source=bl&ots=DjZT-9JCQd&sig=R4MoAzW72PaHvqgZjxPnkkJRs6c&hl=en&sa=X&ei=OdQIUrPgDeTYyAGl6oHYAQ&ved=0CC8Q6AEwAQ#v=onepage&q=%22taking%20a%20closer%20look%20at%20user%20controls%22&f=false
最有趣的区别是它如何处理路由事件。包含的元素引发的所有事件都会将其源重置为用户控件本身。
我认为概念上的区别在于 ContentControl "包含"其内容,而 UserControl 的内容是 UserControl 的"一部分"。因此,ContentControl 是一个不同的元素(可聚焦/制表位(,其内容是单独处理的;设置用户控件的内容是其设计过程的一部分,其元素直接在用户控件的代码隐藏中处理。
所以,我的规则是:
- 如果用户打算继承它并在代码隐藏中处理内容,请继承
UserControl
。 - 如果它打算按原样使用并给定任意内容,请继承
ContentControl
。 - 如果它定义了自己的内容,并且没有任意内容的占位符,请继承
Control
并设置其模板。
如果您只想要一个渲染表面,我认为您不需要Control
。您可以使用ImageSource
,例如InteropBitmap或D3DImage,它们可以附加到ImageBrush。例如,它可以在独立矩形中使用:
<Rectangle>
<Rectangle.Fill>
<ImageBrush>
<ImageBrush.ImageSource>
<!-- ImageSource here -->
</ImageBrush.ImageSource>
</ImageBrush>
</Rectangle.Fill>
<Rectangle>
或其他任何接受Brush
的地方,包括另一个控件的Background
。