您的位置:首页 > 其它

[导入]说说我在使用ToolStrip系列控件时碰到的问题

2006-02-24 11:14 561 查看
.NET 2.0提供了很多以“ToolStrip”开头和以“Strip”结尾的控件。它们的好处是显而易见的,你可以很方便的利用它们实现像Office 2003工具栏那样的界面,让你的软件看起来更“现代”一点。但也碰到了很多新的问题。在我看来,这些问题(当然,问题的原因可能源于已有的习惯)最终源于新的对象继承模型,它们不再都继承于System.Windows.Forms.Control基类,下面是我查到的一个架构图:

ToolStrip : ScrollableControl
MenuStrip
StatusStrip
ToolStripDropDown
ToolStripDropDownMenu
ContextMenuStrip

ToolStripItem : Component
ToolStripSeparator
ToolStripButton
ToolStripLabel
ToolStripStatusLabel
ToolStripDropDownItem
ToolStripMenuItem
ToolStripDropDownButton
ToolStripSplitButton
ToolStripControlHost
ToolStripTextBox
ToolStripProgressBar
ToolStripComboBox

你可以看到它引入了一个新的顶级对象:ToolStripItem。而其中的像ToolStripButton这样的控件,都只是已有控件(比如Button)的Wrapper,而没有从Button类继承。当然,微软这么设计它自然是有合理原因的,但这带来了些问题,现在我觉得最不爽的有两个:

你无法通过重写Control的虚函数来得到自定义的效果
没了Dock和Anchor的支持,这样你得自己编写代码来让一个控件填满所在的容器

尤其是第一个问题,它基本上扼杀了我们为ToolStrip实现新的兼容的控件的能力。当然,你还有ToolStripControlHost可以继承,你可以把任何控件放到这个“Host”里面去,成为一个新的ToolStripItem,但是,它的Look & Feel和其他已有ToolStripItem并不一致(你可以试一下看看效果),这是我无法接受的。

就拿ComboBox来说吧,我手上的一个东西需要实现像Windows资源管理器地址栏那样的ComboBox,也就是其中的items需要缩进,并且需要带图标。你可以重写ComboBox的OnDrawItem虚方法来自己paint那些图标和文字,或者直接重写WndProc虚方法,在其中控制另一个TreeView控件来做到。但在ToolStripComboBox,这些虚方法都不存在。换句话说,要实现这种效果,你得几乎重写整个ToolStripComboBox — 与其如此,我还不如放弃这些ToolStrips,或者选择第三方控件。

BTW,
还是关于ToolStripComboBox,坦白的说,我觉得微软是曾考虑了这种需求的,ToolStripComboBox类有个这样的构造函数:
public ToolStripComboBox (
Control c
);
也许你可以在Control c里面写一些自己的东西,因为这里需要的是基础类Control。不过可惜的是,这个构造函数里面只有一行代码,throw new NotSupportedException。。。
还有一个似乎有希望的地方是,这个控件提供了OnDropDown和OnDropDownClosed两个虚方法,不过,我还是找不到让事件取消的途径(动用无敌的Reflection?),这样TreeView会和已有的菜单一起弹出,很难看。还有些别的办法,比如让TreeView的Parent是ToolStrip,使让TreeView覆盖ComboBox的菜单等等,但我觉得这样的实现很难看(不过也算个办法)。

不知道各位看官还有其他好一点的办法没~


文章来源:http://blog.joycode.com/sunmast/archive/2006/02/22/71874.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐