[导入]说说我在使用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
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
相关文章推荐
- Android Studio该如何导入别人的开源库到自己的项目中并使用库中的控件,网上找过方法但是并不能搞定,希望实际问题 实际解决,拯救我这个傻瓜
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- [导入]经验:使用.net 2.0中的TransactionScope碰到的问题
- 使用bcp批量导入数据时碰到的一些问题及解决
- memcached jar 包 导入错误引起的异常,及使用中碰到的问题
- 使用eclipse导入git项目的系列问题的解决
- VS2010 使用过程中碰到的一个DLL导入失败的问题
- CRichEditCtrl系列讲堂1 VC中在对话框上使用Rich Edit控件相关问题
- 使用TortoiseSVN碰到的几个问题(1)-导入,提交,更新
- VS2010 使用过程中碰到的一个DLL导入失败的问题
- 使用Sqoop将数据从Hive导入MySQL可能遇到的问题
- IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决
- 在MFC中使用OCX控件遇到的一个问题
- WPF项目内使用GDI控件所引起的控件层数问题
- JMeter使用碰到的问题
- ASP.NET 2.0中使用webpart系列控件
- VM linux使用中碰到的问题
- Win32 C++工程中使用离屏面碰到的一个奇怪问题
- TestComplete测试.NET的ToolStrip控件的问题
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法