要为新的自定义控件扩展的内容

本文关键字:扩展 自定义控件 | 更新日期: 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"一书中,有关于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

最有趣的区别是它如何处理路由事件。包含的元素引发的所有事件都会将其源重置为用户控件本身。

我认为概念上的区别在于 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