wel21 Ответов: 2

Как открыть collectioneditor из смарт-тега


У меня проблема с открытием CollectionEditor из verb. Он отлично работает при редактировании из окна свойств, но когда я открываю CollectionEditor из глаголов, он дает мне некомпонентный элемент после добавления нового элемента.

это элемент компонента.
СС1.ПНГ

это то, что я получаю после добавления элемента из глаголов.
СС2.ПНГ

Если вы видите, что после добавления элемента разделы данных и дизайна отсутствуют или новый элемент не является компонентом.

Что я уже пробовал:

ниже приведен мой код. Я что-то упустил? заранее спасибо.

Imports System.Drawing.Design
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Windows.Forms.Design

Friend Class NavCollectionControlDesigner
    Inherits ControlDesigner
    Private MyControl As mSideBarPanelNav

    Public Overrides Sub Initialize(Component As IComponent)
        MyBase.Initialize(Component)
        ' Record instance of control we're designing
        MyControl = DirectCast(Component, mSideBarPanelNav)

    End Sub

    Protected Overrides Sub Dispose(disposing As Boolean)
        MyBase.Dispose(disposing)
    End Sub

    Public Overrides ReadOnly Property AssociatedComponents() As System.Collections.ICollection
        Get
            Return MyControl.Items
        End Get
    End Property

    Public Overrides ReadOnly Property Verbs() As System.ComponentModel.Design.DesignerVerbCollection
        Get
            Dim v As New DesignerVerbCollection()

            ' Verb to add Items
            v.Add(New DesignerVerb("&Edit Items", New EventHandler(AddressOf OnAddButton)))

            Return v
        End Get
    End Property

    Private Sub OnAddButton(sender As Object, e As System.EventArgs)
        Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(MyControl)("Items")
        Dim editor As UITypeEditor = DirectCast(pd.GetEditor(GetType(UITypeEditor)), UITypeEditor)
        Dim serviceProvider As New RuntimeServiceProvider()
        editor.EditValue(serviceProvider, serviceProvider, MyControl.Items)

    End Sub

End Class

Public Class RuntimeServiceProvider
    Implements IServiceProvider
    Implements ITypeDescriptorContext


    Private Function IServiceProvider_GetService(serviceType As Type) As Object Implements IServiceProvider.GetService

        If serviceType = GetType(IWindowsFormsEditorService) Then
            Return New WindowsFormsEditorService()
        End If

        Return Nothing
    End Function

    Private Class WindowsFormsEditorService
        Implements IWindowsFormsEditorService

        Public Sub DropDownControl(control As Control) Implements IWindowsFormsEditorService.DropDownControl
            MsgBox(control.Name)
        End Sub

        Public Sub CloseDropDown() Implements IWindowsFormsEditorService.CloseDropDown
        End Sub

        Public Function ShowDialog(dialog As Form) As System.Windows.Forms.DialogResult Implements IWindowsFormsEditorService.ShowDialog
            dialog.Font = New Font("Segoe UI", 9, FontStyle.Regular)
            Return dialog.ShowDialog()
        End Function

    End Class


    Public Sub OnComponentChanged() Implements ITypeDescriptorContext.OnComponentChanged
        
    End Sub

    Public Function OnComponentChanging() As Boolean Implements ITypeDescriptorContext.OnComponentChanging
        Return ((Not CType(Me, ITypeDescriptorContext).PropertyDescriptor Is Nothing) AndAlso Not CType(Me, ITypeDescriptorContext).PropertyDescriptor.IsReadOnly)
        'Return True
        ' true to keep changes, otherwise false
    End Function

    Public ReadOnly Property Container() As IContainer Implements ITypeDescriptorContext.Container
        Get
            Return Nothing
        End Get
    End Property

    Public ReadOnly Property Instance() As Object Implements ITypeDescriptorContext.Instance
        Get
            Return Nothing
        End Get
    End Property

    Public ReadOnly Property PropertyDescriptor() As PropertyDescriptor Implements ITypeDescriptorContext.PropertyDescriptor
        Get
            Return Nothing
        End Get
    End Property

End Class

Public Class Item
    Inherits Component

    'codes not related to the issue
End Class

<Designer(GetType(NavCollectionControlDesigner))>
Public Class mSideBarPanelNav
    Inherits Control

    Private _Items As New ItemsCollection()
    <Category("Item Collections")>
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    <Editor(GetType(ItemCollectionEditor), GetType(System.Drawing.Design.UITypeEditor))>
    Public ReadOnly Property Items() As ItemsCollection
        Get
            Return _Items
        End Get
    End Property

    'codes not related to the issue
End Class

Ralf Meier

Потому что этот код выглядит совершенно иначе, чем я его понимаю :
Вы хотите отредактировать некоторые свойства вашего элемента управления с помощью SmartTag-Designer, имея маленькую треугольную кнопку в правом верхнем углу вашего элемента управления ? Здесь вы хотите отредактировать коллекцию-свойство (тоже)?

Ralf Meier

Дополнительный :
Покажите также объявление вашей коллекции предметов ..

Ralf Meier

Было бы неплохо, если бы Вы дали обратную связь одному (или обоим) решениям ...

2 Ответов

Рейтинг:
6

Ralf Meier

чтобы показать вам другой способ (Я заменил и изменил ваш дизайнерский класс) :

Public Class NavCollectionControlDesigner
    Inherits ControlDesigner

    Private MyControl As mSideBarPanelNav

    Public Overrides Sub Initialize(Component As IComponent)
        MyBase.Initialize(Component)
        ' Record instance of control we're designing
        MyControl = DirectCast(Component, mSideBarPanelNav)

    End Sub

    Protected Overrides Sub Dispose(disposing As Boolean)
        MyBase.Dispose(disposing)
    End Sub

    Private _ActionLists As DesignerActionListCollection

    Public Overrides ReadOnly Property ActionLists As System.ComponentModel.Design.DesignerActionListCollection
        Get
            If _ActionLists Is Nothing Then
                _ActionLists = New DesignerActionListCollection()
                _ActionLists.Add(New NavCollectionControlSmartTags(Me))
            End If
            Return _ActionLists
        End Get
    End Property

End Class

Public Class NavCollectionControlSmartTags
    Inherits DesignerActionList

    Private _Designer As NavCollectionControlDesigner
    Private _ActiveControl As mSideBarPanelNav
    Private _DesignerActionUIService As DesignerActionUIService

    Public Sub New(ByVal designer As NavCollectionControlDesigner)
        MyBase.New(designer.Component)
        _Designer = designer
        MyBase.AutoShow = False 'True= the SmartTag is directly opened if the Control is newly placed
        _ActiveControl = TryCast(designer.Component, mSideBarPanelNav)
        _DesignerActionUIService = DirectCast(Me.GetService(GetType(DesignerActionUIService)), DesignerActionUIService)
    End Sub

    Public Overrides Function GetSortedActionItems() As DesignerActionItemCollection
        Dim Itemlist As New DesignerActionItemCollection()

        If _ActiveControl IsNot Nothing Then
            Itemlist.Add(New DesignerActionHeaderItem("explaining Text", "Own"))
            Itemlist.Add(New DesignerActionPropertyItem("Items_InActionList", "declared Items", "View", PropertyHelper.GetDescription(_ActiveControl, "Items")))
            Itemlist.Add(New DesignerActionPropertyItem("BackColor_InActionList", "BackColor", "Colors", PropertyHelper.GetDescription(_ActiveControl, "BackColor")))
        End If
        Return Itemlist
    End Function



    ReadOnly Property Items_InActionList() As ItemCollection
        Get
            Return _ActiveControl.Items
        End Get
    End Property

    Public Property BackColor_InActionList() As Color
        Get
            Return _ActiveControl.BackColor
        End Get
        Set(ByVal value As Color)
            _ActiveControl.BackColor = value
        End Set
    End Property

End Class


Рейтинг:
0

Ralf Meier

Если ваша коллекция предметов выглядит так, она должна работать так, как вы хотите :

Public Class ItemCollection
    Inherits CollectionBase

    Public Sub Add(ByVal item As Item)
        List.Add(item)
    End Sub

    Public Property Item(ByVal index As Integer) As Item
        Get
            Return List(index)
        End Get
        Set(ByVal value As Item)
            List(index) = value
        End Set
    End Property

    Protected Overrides Sub OnInsertComplete(ByVal index As Integer, ByVal value As Object)
        Dim item As Item = value

        MyBase.OnInsertComplete(index, item)
    End Sub

    Protected Overrides Sub OnRemoveComplete(ByVal index As Integer, ByVal value As Object)
        Dim item As Item = value

        MyBase.OnRemoveComplete(index, item)
    End Sub

End Class


.. но вы также можете получить доступ к нему другим способом с помощью SmartTag-Designer ...