G
N
I
D
A
O
L

重新审视下拉控件

发表于2012 年 3 月 21 日

不时返回并重新检查旧代码是个好主意。随着时间的推移,会有更多的知识和新的技巧;在我早期的两个自定义 Windows 窗体控件的情况下,这当然是正确的。您可能还记得我的带有分组支持的 ComboBox 控件,以及带有 TreeView 下拉菜单的 ComboBox - 我重新审视了这些控件,特别注意实现我从使用Buffered Paint API的经验中学到的东西。

GroupedComboBox 和 ComboTreeBox 的新版本

分组组合框

为了刷新你的记忆,这个控件扩展了 ComboBox 并添加了一个新属性;组员。使用 PropertyDescriptor 和 owner-drawing,它将分组值相等的项目组合在一起。

什么是新的:

  • 在 Windows Vista 和 7 上,控件没有以与 DropDownList 模式下的普通 ComboBox 控件一致的“按钮样式”出现;这是所有者绘图的限制,但可以通过使用 VisualStyleRenderer 来克服。这是一个有点狡猾的 hack,因为它预先假定 ComboBox 在此模式下的外观,但该功能仅在操作系统被识别为 Vista 或 7 时应用。
  • 该控件与其他 ComboBox 控件不一致,因为它没有动画。使用我开发的 BufferedPainter<T> 类,实现缓冲动画很简单。

组合树框

ComboTreeBox 是一个完全从头开始开发的控件(即它的基类是 Control),它使用分层/树结构作为其数据表示(而不是平面列表)。因此,它与 ComboBox 和 TreeView 有共同的行为。控件的下拉/弹出部分使用 ToolStripDropDown、位图缓存和自定义呈现来实现。

什么是新的:

  • 与 GroupedComboBox 一样,该控件没有出现在 Windows Vista/7 样式中。由于该控件没有可编辑部分并且完全是所有者绘制的,因此很容易在适当的操作系统下模拟外观。在 XP 下,它回退到默认的视觉样式。当主题被禁用时,它会采用经典风格。
  • 控件没有动画。再次使用 BufferedPainter<T> 来实现动画。
  • 由于对其设计器类的强类型引用,该控件以前不能与 .NET Framework 的“客户端配置文件”版本一起使用。相当厚颜无耻的是,我用我的自定义设计器代替了 DomainUpDown 控件使用的内置设计器——这对于限制控件的高度非常有效,并且避免了引用 System.Design 程序集的需要(仅包含在完整版本的框架)。
  • 对重点项目的绘制方式进行了微调;这仅在 Windows 中启用焦点提示时才明显。

https://www.brad-smith.info/blog/archives/477

posted @ 2022-09-19 20:46  firespeed  阅读(23)  评论(0编辑  收藏  举报