3

我正在尝试为 a 构建一个检查列表,该列表ToolStripMenuItem自动处理项目的检查和取消检查,然后我向程序员提供一个事件,允许他们处理接下来发生的事情。如果这样的东西已经存在,我很想知道它在哪里。我已经为我的自定义创建了集合编辑器,ToolStripMenuItem我可以将清单添加到这个清单集合中。我的问题是您像这样创建集合编辑器:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
 Editor(typeof(ToolStripItemExtCollectionEditor), typeof(UITypeEditor))]

我需要能够将 this 传递给此集合编辑ToolStripMenuItemDropDownitems,因此当您添加新清单并单击清单的 items 属性时,您可以在清单中添加/删除任何已知的 ToolStripMenuItems。传递引用是行不通的,因为所有这些都发生在属性内部,如果答案是反射,我不知道从哪里开始。

4

1 回答 1

0

这个答案适用于 VB.NET。我计划把它变成 C# 的 DLL,但现在它在 vb.net 中,因为这是我开始这个想法的地方以及项目所在的语言。

这是我到目前为止所拥有的:

ToolStripMenuItemExt

目的:我的习惯ToolStripMenuItem

ToolStripMenuItemExt有一个CheckListSheet包含对ToolStripMenuItemExt's DropDownItems 的引用(我传入的是 dropdownitems byref 而不是 byval)。它有一个属性可以返回 中的CheckLists对象CheckListSheet

清单表

目的:通过可观察的集合类型和我返回的集合的对象来维护对我正在观察的集合的引用ToolStripMenuItemExt

CheckListSheetCheckLists对象。我通过 byref 传递的下拉项存储在一个ObservableToolStripItemCollection其中,希望当我开始测试它时,我可以更轻松地更新清单集合,因为它继承了ObservableCollection(of ToolStripItemCollection). 这个类还有一个共享函数,它返回具有私有共享范围标识符的可观察集合。

清单

用途:CollectionBase存储CheckList对象的类型。

清单

目的:存储ToolStripItemCollection其对象作为单项检查清单(一次只检查一项)。

这具有设计器的一些属性和检查列表的集合。最终,我将添加逻辑以检查并自动取消选中并为其引发事件。

MenuItemCheckListCollectionEditor

目的:允许将已知和实例化 ToolStripItem对象的集合显示并添加到CheckList.

现在它要求我给它一个类型或类型数组,以便它可以确定CollectionEditor它是什么类型。我无法显示类型的下拉列表或ToolStripItem对象的下拉列表。任何名称中包含 ToolStrip 的类都会继承 ToolStripItem,这就是我使用这种类型的对象的原因。

如果有人对我当前的答案有任何建议或可以预测任何可预见的陷阱,请分享。我不在乎你是用 c# 还是 vb.net 说话。也许我只需要停下来把它变成 c# 代码。也许这是不可能的。不过我正在取得进展。弄清楚 MenuStrip 的集合编辑器如何填充 ToolStripItems 的下拉列表将非常有帮助

[更新]

集合编辑器要求您提供一种类型以供其显示。这种类型必须继承CollectionBase,这意味着在设计时它无法引用下拉项。:叹:

于 2014-09-12T13:42:30.443 回答