有些人建议只展开Panel
,但我也知道UserControl
这听起来像是我应该扩展自己控制的东西。
Panel
与 UserControl
与 Control
与 {{ 1}}
another_alternative
我需要的只是一个绘制的矩形和完整的WinApi能力(Handle,WndProc等)。但我想避免可能进入游戏的所有额外内容。我想使用我的自定义控件将它们添加到标准表单。没有极端的行动。
另一方面,UserControl扩展了可能具有我想要的功能的ContainerControl(我不确定)。
<小时/> 我从// inheritance depth:
Control
Panel : ScrollableControl : Control
UserControl : ContainerControl : ScrollableControl : Control
继承了OpenGL框和其他一些简单的控件。他们到目前为止工作正常。我没有注意到任何功能丢失。 是否有针对Control
的内容? (如果我不需要任何其他功能)
答案 0 :(得分:4)
我认为非官方和接受的“标准”只是继承自UserControl
。至少这是我在其他地方看到的。 虽然这不是正确的事情!
另一方面,我认为你也可能过于担心在这里做的“正确的事情”。对我而言,这与过早优化几乎相似。您希望确保明智地使用资源。
还要记住,以后的事情总是可以在以后更改。
如果您担心某个原因,我肯定会选择最简单的最低继承深度。
答案 1 :(得分:0)
大多数UserControl
是继承的最佳类。另一个选择可能是从我们想要自定义的类继承。
在您的情况下,Panel
应该是最好的继承类,因为它是最符合您需求的控件类。
答案 2 :(得分:0)
Panel
在这里是理想的,因为您没有为控件定义布局。它也不需要ControlTemplate
。自定义渲染方案通常建议使用Panel
。虽然Control
是您可以使用的最简单的“布局”元素,但Panel
可以在以后需要时托管子控件。完美!
答案 3 :(得分:0)
有一篇关于“Pro WPF”一书中UserControl
与ContentControl
的确切区别的说明,该书提供了比MSDN更多的信息。以下是该部分的直接链接:
最有趣的区别在于它如何处理路由事件。由包含的元素引发的所有事件都将Source重置为UserControl本身。
我认为概念上的区别在于ContentControl“包含”其内容,而UserControl的内容是“UserControl的一部分”。因此,ContentControl是一个独立的元素(可聚焦/制表位),其内容是分开处理的;设置UserControl的内容是其设计过程的一部分,其元素直接在UserControl的代码隐藏中处理。
所以,我的规则是:
UserControl
。ContentControl
。Control
并设置其Template。如果您只想要渲染表面,我认为您不需要Control
。您可以使用ImageSource
,例如InteropBitmap或D3DImage,可以附加到ImageBrush。例如,它可以在独立矩形中使用:
<Rectangle>
<Rectangle.Fill>
<ImageBrush>
<ImageBrush.ImageSource>
<!-- ImageSource here -->
</ImageBrush.ImageSource>
</ImageBrush>
</Rectangle.Fill>
<Rectangle>
或接受Brush
的任何其他地方,包括另一个控件的Background
。