Frage

Ich möchte eine Eigenschaft hinzufügen, die eine Sammlung von Kontrollen an eine Komponente darstellt, und eine Sammlung Editor haben, mit dem ich einfach die Bedienelemente auswählen können, die zu der Sammlung gehören. VS tut fast , was ich will automatisch mit dem folgenden Code:

    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

Ich erhalte die Standard-Collection, hinzufügen und entfernen Kontrollen und die Sammlung serialisiert wird.

Das Problem ist, dass ich nicht will hinzufügen neue Kontrollen, ich mehrere Kontrollen von den anderen verfügbaren Steuerelemente auf dem Formular auswählen möchten. Gibt es eine einfache / standard Art und Weise, dies zu tun, oder muss ich zu meiner eigenen Sammlung Editor und führen Sie durch die Kontrollen Sammlung schreiben?

Es gibt zwar viel Material auf Sammlung Editoren (UITypeEditor) und anderen Design-Zeit Themen ist, habe ich nicht in der Lage gewesen, alle Links zu finden genau dieses Verhalten zeigen, so dass jede Hilfe sehr geschätzt wird.

War es hilfreich?

Lösung

OK, also in der Zwischenzeit habe ich zu Mittag gegessen und der Editor selbst geschrieben. War das nicht eine so große Anstrengung. Ich würde mich freuen, zu teilen, wenn es hilft.

Edit: Lösungsübersicht

Ich schrieb einen Editor (siehe Screenshot), die rekursiv listet alle Steuerelemente auf dem Formular in einem treeview gefunden. Wenn die Kontrollen ihres Text oder Bild-Eigenschaften festgelegt haben, den Text / Bild wird angezeigt. Der Benutzer kann mehrere Steuerelemente mit Kontrollkästchen auswählen und auch die Liste nur Display-Steuerung bestimmter Arten filtern.

(Ich muss zugeben, dass obwohl, da dieser Editor nur für den internen Gebrauch bestimmt war, habe ich nicht für die Bildeigenschaft zu überprüfen stören allgemein, ich behandeln nur ein paar bekannten Steuerungstypen.)

Der Code im Editor Form ist wirklich nur für die Benutzeroberfläche, verantwortlich für den Baum Füllung, die Einstellung der Kontrollen auf der Liste der vorgewählten Kontrollen und die Liste der ausgewählten Kontrollen zurückkehren, wenn der Benutzer das Formular mit OK geschlossen wird.

Als nächstes haben wir eine Klasse, die Geräte UITypeEditor, die ich FormControlSelectionEditor genannt. Diese Klasse wird auf die Eigenschaften zugeordnet, die wir den Editor für die Verwendung des [Editor] Attribut verwendet werden soll. Es braucht nicht viel mehr tun, als eine neue Instanz des Formulars zu erstellen, wenn erforderlich, und es als modalen Dialog angezeigt werden soll.

Dann gibt es die Eigenschaften selbst, die vom Typ System.Collections.ObjectModel.ObservableCollection ist (Of Control). Ich wähle ObservableCollection, weil ich auch zu Änderungen an die Listen zur Laufzeit reagieren müssen, aber auch andere Listen würden genauso gut mit kleineren Anpassung tun.

Eine Sache, die ich entdeckte, dass ich musste meine Eigenschaften und Editor schreiben, so dass sie verwenden Kopien der Listen der Kontrollen. Mit anderen Worten, macht der UITypeEditor Code eine Kopie der Liste in der Eigenschaft gespeichert und übergibt sie an die Redaktion Form (für die Kontrollen eingestellt wird, wenn das Formular geöffnet wird), und wenn die Form geschlossen ist, lösche ich die Unterstützung Liste Eigentum und kopieren über jede Kontrolle in der Liste aus dem Editor zurückgegeben. Ich fand, dass ich sonst Probleme mit Serialisierung in der .designer Datei hatte. Ich glaube nicht, dass es so sein muss; Ich denke, es ist eher ein Fehler meinerseits.

-Code für eine typische Eigenschaft:

    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

habe ich den Editor in eine Zip-Datei setzen; es hier herunterladen.

Wie ich schon erwähnt, war dies nur eine quick & dirty Lösung für den internen Gebrauch bestimmt. Immerhin ich Verbesserungsvorschläge schätzen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top