一切皆有可能

SLEEPY BUT POWERFUL (A.K.A 速马) Creative Commons License
随笔 - 43, 评论 - 483, 引用 - 14

导航

关于

我

联系方式 (夏桅 xia4 wei2)

译作

 

三章样章阅读
[CSDN读书频道提供]

 

想做点好事的来看看

一字不识的藏族同胞阿牛创办的完全免费学校

 

MVP Profile

Visual Developer - .NET/C#

Visitors

Locations of visitors to this page

标签

每月存档

最新留言

广告

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

.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类继承。当然,微软这么设计它自然是有合理原因的,但这带来了些问题,现在我觉得最不爽的有两个:

  1. 你无法通过重写Control的虚函数来得到自定义的效果
  2. 没了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的菜单等等,但我觉得这样的实现很难看(不过也算个办法)。

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

posted on 2006-02-22 16:53:00 by sunmast  评论(9) 阅读(9719)

FtpClient Library升级到4.x

FtpClient Library for .NET 2.0: Workspace Home

在我还在读大学时,曾用.NET 1.1/VS.NET 2003为FTP客户端的需求封装了一个FtpClient类库,基于Managed Socket。经过了极其简陋的1.0和2.0版,其3.0稳定版在我毕业前夕发布,之后近两年时间都没有为它继续升级。这是因为虽然之后又发现了几个bug,但后来随着.NET 2.0 beta发布,看到它居然已经内置FTP功能了,所以停止了更新。不过,我现在觉得.NET 2.0内置的FTP功能只是一个较浅的包装,除了一般的简单的FTP任务,在别的情景要用它还得自己编写大量的代码(比如需要自己实现FTP对列等)。

所以年前又花了几个礼拜的时间把它升级到了4.0。它现在依然是开源的,基于GPL(GNU General Public License)协议,发布在GotDotNet.com

FtpClient Library 4.x的目标是为一个FTP客户端应用程序提供底层支持 — 实际上它的GUI部分已经在实现中了,模仿了FlashFXP界面。这样,对于简单的FTP任务,这个类库可能有点过于rich了 — 你直接用FtpWebRequest/FtpWebResponse类即可。

实际上这个项目的想法已经很久了,只是前面半年时间我都在和思归一起翻译我们的书:《.NET企业服务》,讲的是Managed COM+,可以算是System.EnterpriseService的大全了。在翻译完毕之后我才能抽出时间来继续维护这个项目。不过现在也不算晚吧,嗯。

BTW,
这本书译稿均已提交给了博文视点的编辑,但何时出版还不清楚。我估计最快也得下个月吧,慢点可能要到五月,到时候我再来更新BLOG吧。

posted on 2006-02-16 00:42:00 by sunmast  评论(9) 阅读(6089)

DebuggerDisplayAttribute带来的苦闷...

DebuggerDisplayAttribute是.NET 2.0带来的一个新的功能,它可以让你定义一个对象在调试器中的文本表示。这个feature本来可以为调试带来很多方便,没想到弄得我郁闷了好多天

有了DebuggerDisplayAttribute,举例说,代码可以这么写:

    [DebuggerDisplay("{Name}")]
    class Person
    {
        string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

这样调试器里面显示Person对象时就会用它的Name属性显示,像这样:

不过... 你要是忘了给属性赋值,比如这里忘了给Name属性赋值,那调试器就是这个样子:

我就是在这里愣了好几天,这段简单的代码可能一看就知道是什么问题了;但我手上的一个东西偏偏就是给了个NullReferenceException,我单步跟踪时,居然发现C#的new操作符也返回了null!当然,这是被DebuggerDisplayAttribute骗了。而后来发现是因为别的原因抛出的NullReferenceException(所谓无巧不成书)。

后来还把我的代码发给在微软的一个朋友看(我心说用这个bug可以换个XBOX什么的~),不过到现在也没找到问题,似乎也被这个DebuggerDisplayAttribute骗了...

posted on 2006-02-10 23:10:00 by sunmast  评论(0) 阅读(4119)

Powered by: Joycode.MVC引擎 0.5.2.0