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只能承载一个孩子时,我指的是一个直接的孩子。好的,我只想告诉大家这不是我的世界。我不明白你是怎么写的