绘制用户表单的子面板的正确或首选方法是什么

时间:2012-08-16 16:15:51

标签: c# winforms

一个例子:

使用VS我可以创建从UserControl派生的MyControl,可以添加一组数据作为成员或属性。 使用可视化设计器,我可以向MyControl添加两个面板 - 每个面板用于呈现相同的数据,但使用我打算提供的方法以不同的形式(FTSOA表示饼图和条形图)。

我认为有很多方法可以让MyControl使用这些方法重绘面板。

首先使用VS为每个面板添加绘制事件。这很快实现,并允许方法在MyControl类中创建MyControl数据时访问它们。

其次要为每个面板覆盖OnPaint方法。执行此操作的AFAIK需要为每个具有关联类的面板创建UserControl。然后可以覆盖每个类的OnPaint方法。缺点是每个类都必须能够访问MyControl数据。

第三,也可能(我没有做过这一点)覆盖MyControl OnPaint并手动重新绘制每个面板也是可能的 - 但是掌握图形等是一个问题。

问题: 我可以(1& 2)工作,但我想知道其他人的想法。

1 个答案:

答案 0 :(得分:1)

好吧,以上所有。但是Panel控件肯定没有被优化为一个非常好的绘画控件。它源自ScrollableControl,它就是它真正擅长的东西,一个可以滚动其内容的容器。也可以快速移动一组控件。或隐藏它们。或者禁用它们。

它不完全适合绘画。它没有双缓冲,打开它需要从中获得自己的控制。并且它还优化了容器行为,您需要打开ControlStyles.ResizeRedraw样式以在调整Paint事件大小时触发它。如果你真的需要自定义绘画需要可滚动,那么Panel是一个很好的基类派生。

听起来你应该真的覆盖UserControl的OnPaint()方法。最小化控件数量是一个非常强大的优化目标,它们非常昂贵。