0

一个例子:

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

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

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

其次为每个面板覆盖 OnPaint 方法。AFAIK 要做到这一点,需要为每个具有关联类的面板创建一个 UserControl。然后可以覆盖每个类的 OnPaint 方法。缺点是每个类都必须有权访问 MyControl 数据。

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

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

4

1 回答 1

1

嗯,以上都是。但是 Panel 控件当然没有优化为非常好的绘画控件。它派生自 ScrollableControl,而这正是它真正擅长的,一个可以滚动其内容的容器。也是移动一组控件的快速方法。或者隐藏它们。或禁用它们。

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

在我看来,您应该真正覆盖 UserControl 的 OnPaint() 方法。最小化控件的数量是一个非常强大的优化目标,它们确实很昂贵。

于 2012-08-16T16:46:20.937 回答