4

有些人建议只是扩展Panel,但我也知道UserControl这听起来像是我应该扩展以进行自己的控制。

Panel对比UserControl对比Control对比another_alternative

// inheritance depth:
Control
Panel : ScrollableControl : Control
UserControl : ContainerControl : ScrollableControl : Control

我只需要一个矩形来绘制和完整的 WinApi 功能(Handle、WndProc 等)。但我想避免所有可能出现在游戏中的额外内容。我想使用我的自定义控件将它们添加到标准表单中。没有极端行为。

另一方面,UserControl 扩展了 ContainerControl,它可能具有我想要的功能(我不确定)。


我继承Control了一个 OpenGL 框和其他一些简单的控件。到目前为止,它们工作正常。我没有注意到任何功能损失。有什么反对Control吗? (如果我不需要任何额外的功能)

4

4 回答 4

4

我认为非官方和公认的“标准”只是继承自UserControl. 至少这是我在其他地方看到的。但这并不意味着它是正确的!

另一方面,我认为您也可能过于关注在这里做的“正确的事情”。对我来说,这几乎类似于过早优化。您要确保明智地使用资源。

还要记住,这样的事情以后总是可以改变的。

如果您出于某种原因担心,我肯定会选择继承深度最低的最简单的控件。

于 2013-08-12T10:28:14.237 回答
0

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

在您的情况下,Panel应该是最好的继承类,因为它是满足您要求的最简单的控制类。

于 2013-08-12T11:17:00.843 回答
0

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

于 2013-08-12T11:17:26.047 回答
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=OdQIUQYAHYPgDe =0CC8Q6AEwAQ#v=onepage&q=%22taking%20a%20closer%20look%20at%20user%20controls%22&f=false

最有趣的区别是它如何处理路由事件。包含的元素引发的所有事件都将其重置为 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>

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

于 2013-08-12T13:12:38.137 回答