[翻译]再论下拉框控件

threenewbee 2012-10-03 05:19:49
加精
[翻译]再论下拉框控件

不时回头重新审视旧的代码是一个好注意。随着时间的推移来增长知识和获得新技巧,从我之前写的两个自定义Windows窗体控件的经历中,我体会到的确如此。你可能还记得我的ComboBox控件分组的支持,以及带有TreeView的下拉组合框——我要用我在缓冲绘图API中学习到的经验和思想来重新审视这些控件。



GroupedComboBox

这个控件扩展了ComboBox控件,并增加了一个新的属性:GroupMember。使用PropertyDescriptor并且自绘,它可以对分组值相等的项目进行分组。

新增功能:

 在Windows Vista和Windows 7下,使用DropDownList模式,控件并没有以传统的ComboBox控件的“按钮样式”呈现,这是自绘控件的限制,但通过使用VisualStyleRenderer可以克服。在这种模式下可以用一个精巧的Hack来预设ComboBox的外观,但这个功能只适用于OS被识别为Vista或Windows7。
 这个控件与其它的ComboBox控件是不一致的,因为它的下拉缺乏动画过渡。通过使用我编写的BufferedPainter<T>类,可以很容易地实现缓冲动画。

ComboTreeBox

ComboTreeBox控件是完全从头开始开发的(即它的基类是Control类),它使用一个层次/树型结构数据表示(而不是一个平坦的列表)。因此,它与组合框和TreeView具有一致的行为。控件的下拉部分是通过使用ToolStripDropDown,位图缓存和自定义渲染来实现的。

新增功能:

 类似于GroupedComboBox,控件没有使用Windows Vista/7风格的外观。因为控件没有可编辑的部分完全是自绘的,所以很容易在相应的操作系统中模拟对应的外观。在XP中,它使用默认的视觉样式。当主题被禁用时,它使用经典样式。
 控件不支持动画。BufferedPainter<T>再次被用于实现动画。
 由于强类型引用它的设计器类,以前的控件在.NET框架库的“Client Profile”版本中不能使用。为此,我用我自定义的设计器取代了DomainUpDown控件使用的内置的设计器——它可以有效控制控件的高度并且避免引用System.Design程序集(只包含在完整版本的框架库中)。
 对项的绘制的小调整,只针对在Windows中启用在焦点控件周围绘制虚框的功能。

下载

DropDownControlsUpdated.zip(Visual Studio 2010解决方案,.NET Framework 4 Client Profile)

注:本文翻译自 http://www.brad-smith.info/blog/archives/477,作者是Bradley Smith。
...全文
3908 131 打赏 收藏 转发到动态 举报
写回复
用AI写文章
131 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfasri 2012-10-18
  • 打赏
  • 举报
回复
控件的架构来说, C#的是隐蔽性太强了, 因为内部没有源代码可以让你看, 有的只是说明.

一个万能的下拉控件, 我在DELPHI下的实现方式会分成两个部分:
1. 带按钮的基本Edit框
2. 弹出用的窗口类

利用Edit框与不同的弹出窗口类组合, 可以得到万能的ComboBox.
在Delphi下, 可以完美实现日期下拉, 树形下拉, 列表下拉等多种方式
YIDENGBONE 2012-10-17
  • 打赏
  • 举报
回复
谢谢楼主分享。
LAONINGA098 2012-10-17
  • 打赏
  • 举报
回复
先支持下
阿军同學 2012-10-16
  • 打赏
  • 举报
回复
强力支持!!
joyafa123 2012-10-16
  • 打赏
  • 举报
回复
什么东西啊啊,好使不
tang12s 2012-10-16
  • 打赏
  • 举报
回复
感谢分享
  • 打赏
  • 举报
回复
顶起,……
岂_辰 2012-10-15
  • 打赏
  • 举报
回复
学习了!
nyxuem 2012-10-15
  • 打赏
  • 举报
回复
顶一下。
呐伪装 2012-10-15
  • 打赏
  • 举报
回复
谢谢楼主分享
x865522060 2012-10-14
  • 打赏
  • 举报
回复
在Windows Vista和Windows 7下,使用DropDownList模式
草根豆 2012-10-14
  • 打赏
  • 举报
回复
俺现在用着 VS2010开发,却用着 2.0的框架...
kinwal 2012-10-13
  • 打赏
  • 举报
回复
支持一个吧,新来咋到
最美的词 2012-10-13
  • 打赏
  • 举报
回复
支持一下
Fat_Cai 2012-10-12
  • 打赏
  • 举报
回复
非常感谢!!
olddog99 2012-10-12
  • 打赏
  • 举报
回复
厉害的很难嫩
frogoscar 2012-10-12
  • 打赏
  • 举报
回复
不错,看看~~~~~~~~~~~~~~~~~~~~~~~
jinshiyuan318 2012-10-12
  • 打赏
  • 举报
回复
不给分了
永远的小鱼 2012-10-11
  • 打赏
  • 举报
回复
感谢分享啊
qq120372733 2012-10-11
  • 打赏
  • 举报
回复
8额发的一条缝 哦 哦
加载更多回复(43)

110,825

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧