对于控件集合的设计时编辑器支持(Design-time editor support for con

2019-07-04 14:50发布

我想补充表示的控件组件集合的属性,并有一个集合编辑器,我可以很容易地选择属于集合的控件。 VS做几乎是我用下面的代码自动希望:

    Private _controls As New List(Of Control)
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public ReadOnly Property SelectedControls() As List(Of Control)
        Get
            Return _controls
        End Get
    End Property

我得到默认CollectionEditor,可以添加和删除控件,以及收集序列化。

问题是,我不希望添加新的控件,我想从表单上其他可用的控制选择多个控件。 有没有做到这一点任何简单/标准方式,或者我会写我自己的集合编辑器,并通过控件集合运行?

虽然有很多关于收集编辑器(UITypeEditors)和其他设计时主题的材料,我一直没能找到证明了该确切的行为有任何联系,所以任何帮助表示赞赏。

Answer 1:

好了,在此期间,我吃了午饭,并写入编辑自己。 没有这样一个巨大的努力。 我很乐意分享,如果有帮助。

编辑:解决方案概述

我写了一个编辑器(见截图),该递归列出一个TreeView表格上发现的所有控件。 如果控制装置具有它们文本或图像属性中设置被显示在文本/图像。 用户可以选择与复选框多个控件,甚至过滤列表,从而只有某些类型的显示控制。

(我必须承认,虽然,因为这是编辑仅供内部使用,我没有刻意去一般检查对图像特性,我只处理了几个知名的控制类型。)

替代文字http://i37.tinypic.com/154enpw.png

在编辑器形式的代码实际上只是用户界面,负责填充树,预先选定的控件列表上设置检查,并在用户关闭与OK的形式返回选定的控件列表。

接下来,我们有一个实现UITypeEditor的,我把它叫做FormControlSelectionEditor类。 这个类是分配给我们想要使用使用[编辑]属性编辑器的属性。 它没有做更多的事情需要时不是创建窗体的新实例并将其显示为一个模式对话框。

再就是属性本身,这是类型System.Collections.ObjectModel.ObservableCollection(的控制)的。 我选择的ObservableCollection,因为我需要能够应对在运行时更改列表为好,但其他名单将与未成年人适应事情做的很好。

有一件事我发现的是,我不得不写我的属性和编辑器,他们使用的管制清单的复印件。 换句话说,在UITypeEditor的代码使存储在属性列表中的副本,并将其传递给编辑形式(打开表单时设置的检查),当窗体关闭,我明确财产的后盾列表拷贝过来在从编辑器返回的列表中的每个控制。 我发现,否则我曾与在.designer文件序列化的问题。 我不相信它是这个样子; 我认为它更可能由于我的错误。

代码的典型特性:

    Private WithEvents _insertButtons As New System.Collections.ObjectModel.ObservableCollection(Of Control)
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    <Editor(GetType(Design.FormControlSelectionEditor), GetType(UITypeEditor))> _
    Public Property InsertButtons() As System.Collections.ObjectModel.ObservableCollection(Of Control)
        Get
            Return _insertButtons
        End Get
        Set(ByVal value As System.Collections.ObjectModel.ObservableCollection(Of Control))
            If value Is Nothing Then
                RemoveInsertButtonEventHandlers(_insertButtons)
                _insertButtons.Clear()
            Else
                ' Copy the list items passed in into the internal list
                For i As Integer = _insertButtons.Count - 1 To 0 Step -1
                    If Not value.Contains(_insertButtons.Item(i)) Then _insertButtons.RemoveAt(i)
                Next
                For Each ctl As Control In value
                    If Not _insertButtons.Contains(ctl) Then _insertButtons.Add(ctl)
                Next
            End If
        End Set
    End Property
    Private Function ShouldSerializeInsertButtons() As Boolean
        Return _insertButtons.Count > 0
    End Function
    Private Sub ResetInsertButtons()
        InsertButtons = Nothing
    End Sub

我已经把编辑成一个zip文件; 在这里下载 。

正如我前面提到的,这只是一个快速和肮脏的解决方案仅供内部使用。 尽管如此,我会很感激任何改进的建议。



文章来源: Design-time editor support for controls collection