2017-02-28 4 views
2

TL; DR;
Wie kann ich eine Copy-Paste-Funktion zu einer komplexen Eigenschaft mit mehreren Werten hinzufügen, mit der ich den Eigenschaftswert aus einem Benutzersteuerelement kopieren und zur Entwurfszeit in ein anderes Steuerelement einfügen kann?Wie kopiert man einen komplexen Eigenschaftswert von einem Benutzersteuerelement in ein anderes als Entwurfszeit?

Die lange Geschichte

ich ein Benutzersteuer erstellt haben (StylableControl), die eine komplexe Eigenschaft Style genannt hat.

Diese Eigenschaft enthält eine Instanz einer Klasse namens StylableControlStyles, die mehrere Instanzen einer Klasse Style, wo jeder hält Werte wie BackColor, ForeColor, Image, Gradient (eine andere Klasse die ich angelegt habe) usw. genannt enthält.

Ich habe auch einen benutzerdefinierten Steuerelement-Designer erstellt, um die Bearbeitungsstileigenschaft für das Benutzersteuerelement zu ermöglichen. Es zeigt ein Formular, in dem jede Stilklasse in der Stileigenschaft leicht bearbeitet werden kann.

Jetzt möchte ich den Nutzern dieser Steuerung eine einfache Möglichkeit, den gesamten Inhalt des Style Eigentum von einer Instanz der Benutzersteuerung an eine andere Instanz, zur Entwurfszeit zu kopieren.

Ich könnte natürlich, überschreiben die ToString() Methode des StylableControlStyles Objekt eine String-Darstellung zu erzeugen, die alle gespeicherten Daten in diesem Objekt kapseln wird, aber das wäre eine hugh String und natürlich schaffen würde eine Menge Arbeit benötigen Parsing es im Klassenkonverter (derzeit verwende ich nur eine ExpandableObjectConverter).
Ich möchte das möglichst vermeiden.

+0

Sind Sie Vielleicht einfach nach einer Möglichkeit suchen, eine Objekthierarchie tief zu klonen oder tief zu kopieren? Wenn ja, gibt es bereits [mehrere Antworten] (http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-of-an-object-in-net-c-spezifisch) [hier auf SO] (http://stackoverflow.com/questions/78536/deep-cloning-objects) – jcb

+0

@jcb Eigentlich wird der colning Teil schon geschrieben, das ist nicht mein Problem. Ich bin auf der Suche nach einer Möglichkeit, Design-Time-Unterstützung für Copy-Paste-Werte zwischen Steuerelementen in einem Formular bereitzustellen. So etwas wie ein Smart-Tag-Befehl, mit dem der Benutzer eine andere Instanz des Benutzersteuerelements auswählen und dessen Stil in den Stil der aktuellen Instanz kopieren kann. –

+0

@ZoharPeled, wenn Sie bereits ein benutzerdefiniertes Steuerelement-Designer-Formular haben, fügen Sie beispielsweise die Schaltflächen "Stil kopieren" und "Kopierten Stil hinzufügen" hinzu. Der kopierte Stil kann in einem Puffer gespeichert werden (vielleicht sogar in der Zwischenablage. Wenn es ein für Menschen lesbares Format ist, können Benutzer kopierten Wert in .designer einfügen.cs-Datei direkt) – ASh

Antwort

0

Beratung Ashs Nach in den Kommentaren habe ich ein DesignerVerb zu kopieren und fügen Sie die Style zu und von einem privaten statischen Elemente des Typs Style des Steuer Designers verwendet.

So in meiner Kontrolle Designerklasse I haben:

private static ZControlStyle _CopiedStyle; 

Und haben diese Designer Verben hinzugefügt:

_Verbs.Add(new DesignerVerb("Copy Styles", CopyStyle)); 
_Verbs.Add(new DesignerVerb("Paste Styles", PasteStyle)); 

und die Methoden für die Kopie ans Paste:

private void PasteStyle(object sender, EventArgs e) 
{ 
    if (_CopiedStyle != null) 
    { 
     var toggleButton = Control as ZToggleButton; 
     if (toggleButton != null) 
     { 
      toggleButton.Style.FromStyle(_CopiedStyle); 
     } 
     else 
     { 
      (Control as ZControl).Style.FromStyle(_CopiedStyle); 
     } 

    } 
} 

private void CopyStyle(object sender, EventArgs e) 
{ 
    var toggleButton = Control as ZToggleButton; 
    if (toggleButton != null) 
    { 
     _CopiedStyle = toggleButton.Style; 
    } 
    else 
    { 
     _CopiedStyle = (Control as ZControl)?.Style; 
    } 
} 
Verwandte Themen