什么扩展为新的自定义控件?

时间:2013-08-12 10:19:05

标签: c# winforms user-controls

有些人建议只展开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的内容? (如果我不需要任何其他功能)

4 个答案:

答案 0 :(得分:4)

我认为非官方和接受的“标准”只是继承自UserControl。至少这是我在其他地方看到的。 虽然这不是正确的事情!

另一方面,我认为你也可能过于担心在这里做的“正确的事情”。对我而言,这与过早优化几乎相似。您希望确保明智地使用资源。

还要记住,以后的事情总是可以在以后更改。

如果您担心某个原因,我肯定会选择最简单最低继承深度。

答案 1 :(得分:0)

大多数UserControl是继承的最佳类。另一个选择可能是从我们想要自定义的类继承。

在您的情况下,Panel应该是最好的继承类,因为它是最符合您需求的控件类。

答案 2 :(得分:0)

Panel在这里是理想的,因为您没有为控件定义布局。它也不需要ControlTemplate。自定义渲染方案通常建议使用Panel。虽然Control是您可以使用的最简单的“布局”元素,但Panel可以在以后需要时托管子控件。完美!

答案 3 :(得分:0)

有一篇关于“Pro WPF”一书中UserControlContentControl的确切区别的说明,该书提供了比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

最有趣的区别在于它如何处理路由事件。由包含的元素引发的所有事件都将Source重置为UserControl本身。

我认为概念上的区别在于ContentControl“包含”其内容,而UserControl的内容是“UserControl的一部分”。因此,ContentControl是一个独立的元素(可聚焦/制表位),其内容是分开处理的;设置UserControl的内容是其设计过程的一部分,其元素直接在UserControl的代码隐藏中处理。

所以,我的规则是:

  • 如果用户要继承并处理代码隐藏中的内容,请继承UserControl
  • 如果要按原样使用并提供任意内容,请继承ContentControl
  • 如果它定义了自己的内容,并且没有任意内容的占位符,请继承Control并设置其Template

如果您只想要渲染表面,我认为您不需要Control。您可以使用ImageSource,例如InteropBitmapD3DImage,可以附加到ImageBrush。例如,它可以在独立矩形中使用:

<Rectangle>
    <Rectangle.Fill>
        <ImageBrush>
            <ImageBrush.ImageSource>
                <!-- ImageSource here -->
            </ImageBrush.ImageSource>
        </ImageBrush>
    </Rectangle.Fill>
<Rectangle>

或接受Brush的任何其他地方,包括另一个控件的Background