C# 新自定义控件要扩展什么?

C# 新自定义控件要扩展什么?,c#,winforms,user-controls,C#,Winforms,User Controls,有些人建议只扩展面板,但我也知道UserControl,这听起来像是我应该扩展以实现自己的控制 面板与用户控制与控制与另一种选择 // inheritance depth: Control Panel : ScrollableControl : Control UserControl : ContainerControl : ScrollableControl : Control 我所需要的只是一个矩形来绘制和完整的WinApi功能(句柄、WndProc等)。但我想避免所有可能出现在剧中的额外

有些人建议只扩展
面板
,但我也知道
UserControl
,这听起来像是我应该扩展以实现自己的控制

面板
用户控制
控制
另一种选择

// inheritance depth:
Control
Panel : ScrollableControl : Control
UserControl : ContainerControl : ScrollableControl : Control
我所需要的只是一个矩形来绘制和完整的WinApi功能(句柄、WndProc等)。但我想避免所有可能出现在剧中的额外因素。我想使用自定义控件将它们添加到标准表单中。没有极端行为

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

我继承了OpenGL框和其他一些简单控件的
控件。到目前为止,他们工作得很好。我没有注意到任何功能损失是否有什么东西反对
控件
(以防我不需要任何额外的功能)

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

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

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


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

大多数
UserControl
是最好的继承类。另一个选项是从我们想要自定义的类继承


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

Panel
在这里非常理想,因为您没有为控件定义布局。它也不需要
控制模板
。自定义渲染方案通常附带使用
面板的建议。虽然
Control
是您可以获得的最简单的“布局”元素,
Panel
能够承载稍后需要的子控件。太好了

在“Pro WPF”一书中,有一个关于
UserControl
ContentControl
的确切区别的描述,该书提供了比MSDN更多的信息。以下是该部分的直接链接:

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

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

因此,我的规则是:

  • 如果用户打算继承它并在代码隐藏中处理内容,请继承
    UserControl
  • 如果要按原样使用并给定任意内容,请继承
    ContentControl
  • 如果它定义了自己的内容,并且没有用于任意内容的占位符,请继承
    控件
    并设置其值

如果您只需要渲染曲面,我认为您不需要
控件。您可以为此使用
ImageSource
,例如或,它可以附加到。例如,它可以在独立的矩形中使用:

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


或者任何其他接受
画笔的地方,包括另一个控件的
背景

使用用户控件,在发布问题之前请检查,google和youtube上有这么多的信息和示例,所以你可以看到你能得到什么为什么继承深度很重要?@joe这只是供参考的东西。对于WinAPI,你不需要在窗口级别处理所有事情吗?您只需要一个支持键盘焦点的元素(即任何
UIElement
),并为主机窗口设置一个WndProc,该窗口执行
if(keyboard.FocusedElement==yourElement).
@mini-me-然后转到
面板
。遵循开发者的心意。我的心意是
控件
,因为它最简单,继承深度最低。嗯,控件已经可以承载控件了。按钮可以承载网格框和各种疯狂的东西。按钮从ContentControl继承,而不是直接从control继承。这允许它们承载单个子内容(任何对象)。面板能够直接承载许多元素(包括内容控件)。继承者只需要定义布局方法。a) 在我看来,这似乎是MSDN中的一个错误。因为从.NET Framework按钮的元数据判断,它不从任何ContentControl继承。b) 控件(按钮)也可以承载(具有子控件)您想要的任意多的其他控件。@mini-me我不知道您正在查看的元数据是什么,但是
typeof(ContentControl)。IsAssignableFrom(typeof(Button))
是真的,所以Button肯定继承了ContentControl。但是,您是对的,所有控件都可以承载其他控件,因为它们使用ControlTemplates。“内容”和简单嵌套控件之间的区别在于使用了一种新的控件,它通过DataTemplates将数据转换为元素。例如,当您将内容设置为字符串时,演示者将生成一个文本块。当我说ContentControl只能承载一个孩子时,我指的是一个直接的孩子。好的,我只想告诉大家这不是我的世界。我不明白你是怎么写的