Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 操作列表/智能标记面板上的自定义UITypeEditor_.net_Windows Forms Designer_Design Time_Uitypeeditor_Actionlist - Fatal编程技术网

.net 操作列表/智能标记面板上的自定义UITypeEditor

.net 操作列表/智能标记面板上的自定义UITypeEditor,.net,windows-forms-designer,design-time,uitypeeditor,actionlist,.net,Windows Forms Designer,Design Time,Uitypeeditor,Actionlist,我有一个自定义UserControl,其属性名为OptionsNode类型的ParentNode,它继承TreeNode。我的控件包含一个树状视图,其中许多节点在设计时显示。ParentNode属性应该允许用户选择树视图中的一个节点,类似于从属性网格中的下拉列表中选择组件的方式,该下拉列表随后显示所有可用组件。例如,任何窗体的AcceptButton属性都会显示一个下拉列表,其中有窗体上的所有按钮可供选择 为了在属性网格中获得这种行为,我为OptionsNode类编写了一个自定义UITypeEd

我有一个自定义UserControl,其属性名为OptionsNode类型的ParentNode,它继承TreeNode。我的控件包含一个树状视图,其中许多节点在设计时显示。ParentNode属性应该允许用户选择树视图中的一个节点,类似于从属性网格中的下拉列表中选择组件的方式,该下拉列表随后显示所有可用组件。例如,任何窗体的AcceptButton属性都会显示一个下拉列表,其中有窗体上的所有按钮可供选择

为了在属性网格中获得这种行为,我为OptionsNode类编写了一个自定义UITypeEditor。这告诉属性网格显示一个下拉列表,在这个下拉列表中,我添加了一个列表框,其中填充了树视图中所有节点的列表。这很好,用户可以下拉“属性”并通过单击它来选择节点

现在,在做了更多的工作之后,我实现了一个定制的ControlDesigner,以及一个ActionList,有时称为智能标记面板。我说的是带有常见属性/设计器方法的小弹出窗口,当您单击某些控件右上角的[>]按钮时会弹出。例如,TabControl允许您从中添加/删除tabpages

我以前都做过,效果很好。现在的问题是,我想在ActionList面板上显示相同的ParentNode属性。因此,DesignerActionList类有一个“代理属性”,它将属性值从ActionList传递到控件,反之亦然,正如文档和本文中所述:

代码:

然而,这是行不通的。ActionList只是在智能标记面板中显示一个文本框,而不是我的自定义UITypeEditor

我在之前链接的文章中读了更多http://msdn.microsoft.com/en-us/magazine/cc163758.aspxS3 他专门研究这个问题。他的时钟控件具有FaceEditor UITypeEditor的Face属性,允许用户通过下拉菜单以图形方式选择时钟面数字、模拟或两者

他的解决方案是简单地用编辑器属性装饰代理属性,与原始面属性相同

好的,我试过了:

    <Editor(GetType(Editors.OptionsNodeEditor), GetType(UITypeEditor))> _
    Public Property ParentNode As OptionsNode
        Get
            Return Me.Host.ParentNode
        End Get
        Set(value As OptionsNode)                 
            Me.SetProperty("ParentNode", value)                 
            Me.DesignerActionService.Refresh(Me.Host)
        End Set
    End Property
当我打开“操作列表”窗口时,它会显示一个下拉样式,而不是文本框。伟大的但当我试图打开下拉列表时,我得到一个错误: 使用下拉列表时出错:无法将“OptionsPanelActionList”类型的对象强制转换为“OptionsPanel”

我不理解这个错误。它似乎试图将OptionsPanelActionList对象强制转换为OptionsPanel。OptionsPanel是我正在设计的控件OptionsPanelActionList是OptionsPanelDesigner中的一个操作列表,是OptionsPanel控件的设计器,但我看不出它在这里有什么关系。我没有在任何地方施放,但显然代码是在幕后某处这样做的

我错过了什么?为什么我的编辑器在尝试使用自定义UITypeEditor时会抛出错误,而文章指出它应该可以工作

谢谢

我自己解决了

这个问题确实是对选项面板的一种选择。它出现在我的自定义UITypeEditor中。我需要对正在编辑的控制选项面板的引用,发现可以通过上下文获取该引用。实例属性:

Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As System.IServiceProvider, value As Object) As Object
    Dim panel As OptionsPanel = DirectCast(context.Instance, OptionsPanel)
    '...
End Function
显然,当通过ActionList/Smart Tag窗口编辑属性时,context.Instance对象不是面板,而是ActionList类的实例。因此,我现在尝试首先将实例强制转换为OptionsPanel,如果失败,我假设它是ActionList类,并使用其Host或Control属性来获取OptionsPanel

到目前为止似乎还有效

Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As System.IServiceProvider, value As Object) As Object
    Dim panel As OptionsPanel = DirectCast(context.Instance, OptionsPanel)
    '...
End Function