返回首页


简介
这些控件依赖于相同的基本思路:通过枚举配置的GUI元素已经在你的业务逻辑。相比之下,这次提交生成泛型类型的菜单,配置为一个枚举类型参数。 ActionMenuStriplt; TGT;封装了一套独立行动(点击菜单按钮),而OptionMenuStriplt; TGT;(独家)选项(检查单选框/复选框)选择。背景
这两个控件从System.Windows.Forms.ContextMenuStrip派生的,因此它们可以直接被分配到Control.ContextMenuStrip / ToolStripDropDownButton.DropDown属性,或在更大的菜单ToolStripDropDownMenu使用。所有枚举成员,创建了相应的菜单项,内部确定一个可选的共同的基本名称和枚举成员的名称组成的名称。它可以指定零值的成员是否构成一个有效的选项,或是否会被忽视。达到或超过一定值时(即"最后一个"或"全部")枚举成员可以被排除在外。
菜单项的文本是枚举成员的名称本身,或可通过一个字符串数组,它允许本地化或使用加速器。第三种方法包括分配一个代表,它返回一个项目文本。ocActionMenuStriplt; TGT;
它的公共接口(轻微和重载成员剥离)看起来像这样:公共类ocActionMenuStriplt; TGT;的ContextMenuStrip, INotifyPropertyChanged的,其中T:{ 公共事件的EventHandler ActionClicked 公共ocActionMenuStrip() 市民代表字符串GetActionMenuText(T项目) 公共GetActionMenuText MenuTexts集合{;} 公共T ActionEnabled {;} 公共T ActionVisible {;} 公共T行动{;} 公共ToolStripItemCollection ActionItems {获取;} 公共ToolStripItemCollection ActionAddItems( baseItemName字符串,BOOL includeZero& #160; T excludeAtMember,字符串[] menutext)
随着ActionEnabled / ActionVisible属性,单个菜单项可以禁用/隐藏(即,在开幕仪式上)。枚举T必须按位(标记),使用这些功能。其他ToolStripMenuItems使用基类的Items属性,可能会增加,没有威慑功能。在这种情况下,ActionItems属性返回的派生类中维护的项目的一个子集,否则等于Items属性。ocOptionMenuStriplt;公共类ocOptionMenuStriplt TGT;; TGT;的ContextMenuStrip, INotifyPropertyChanged的,其中T:{ 公共事件的EventHandler OptionChanged 60; 公共事件的PropertyChanged PropertyChangedEventHandler 公共ocOptionMenuStrip() 市民代表字符串GetOptionMenuText(T项目) 公共GetOptionMenuText MenuTexts集合{;} 公共布尔OptionExclusive {;} 公共布尔CancelClosingOnCheck {;}  0; 公共T OptionEnabled {;} 公共T OptionVisible {;} 公共t选项{获取;设置;} & #160; 公共OptionMember T {获得;} 公共ToolStripItemCollection OptionItems {获取;} 公共ToolStripItemCollection OptionAddItems( baseItemName字符串,BOOL includeZero &# 160;T excludeAtMember,字符串[] menutext)}
OptionExclusive属性指定的菜单是否为独占或个人项目的检查。单选按钮呈现独家菜单,个人使用的标准对号图像。 CancelClosingOnCheck属性设置,菜单保持开放,当一个项目被选中。实施INotifyPropertyChanged接口允许数据绑定选项属性UserSettings。 OptionMember属性标识枚举成员造成的单个菜单的最后变化。使用代码
由于没有设计时支持(我根本不知道如何实现这与一般的控制),所有声明,必须手工编码。一个例子配置一个独有的选项菜单,使用枚举名称,但不包括零和最后一个成员,如下所示:[标志]私人枚举MyEnum {无= 0,首先= 1,   ; 秒= 2,第三= 4,= 7}私人ocOptionMenuStriplt; MyEnumgt; OMS; OMS =新ocOptionMenuStriplt; MyEnumgt;(); oms.MenuTexts =委托(MyEnum项目) { &# 160; 返回(项目== MyEnum.first)? "特别Firstquot;:空; } oms.OptionAddItems(NULL,FALSE,MyEnum.all); 60; oms.OptionEnabled = MyEnum.all放大器;〜MyEnum.second; oms.OptionChanged = this.oms_OptionChanged;无效oms_OptionChanged(对象发件人,级:){ 开关(oms.Option) { 案件MyEnum.first: / / ... }}
包括两个示范项目显示可用的可能性。兴趣点如何实现与一般控制的设计时支持?您的意见和建议。历史2005年12月:OptionMenuStrip上公布。2006年4月:最喜欢的网站在我的新修订和再版,后斑点。1.0版,2006年6月7日: 重载与PARAMS XXXAddItems方法排除成员。现在设置菜单文本使用一个委托。Bug修复:包括零成员无法启用。
OptionMenuStrip:前OptionBitwise成为相反的功能OptionExclusive。OptionMember标识变化的原因。独家菜单绘制单选按钮图像。

回答

评论会员:OrlandoCurioso 时间:2011/12/06
"有没有设计时支持(我根本不知道如何实现与通用控件)"

通用控件的设计时支持将是冷静的。
同时,这是一个错误上市,但不是固定不变的SP1的
投票!

评论会员:Doncp 时间:2011/12/06
我试图寻找(编辑)ocActionMenuStrip.cs得到以下错误:

找不到"T"型。请确保包含此类型的大会,是引用。如果这种类型的开发项目的一部分,确保该项目已成功建成。

我使用Visual Studio 2005。
该项目的建立和运行确定。



评论会员:OrlandoCurioso 时间:2011/12/06
您得到的错误,如果你正在使用的
设计师查看control.As说是"没有设计时支持",所以
你不能在窗体上拖放这些控件,也不使用设计视图
应用DesignerCategoryAttribute("默认")应该关闭任何视觉设计师,但
在这种情况下,我得到没有效果("视图设计器"按钮,在解决方案资源管理器中消失,组件/控件的变化,一个标准的类的图标)。

我个人并不需要一个设计师在这里,但我感兴趣的如何使用通用组件的设计师,因为我没有任何线索。
任何想法?

评论会员:OrlandoCurioso 时间:2011/12/06