2017-02-28 5 views
2

TL; DR;
Comment puis-je ajouter une fonctionnalité de copier-coller à une propriété complexe à valeurs multiples qui me permettra de copier la valeur de propriété d'un contrôle utilisateur et de la coller dans un autre au moment de la conception?Comment copier une valeur de propriété complexe d'un contrôle utilisateur à un autre comme temps de conception?

La longue histoire

J'ai créé un contrôle utilisateur (StylableControl) qui possède une propriété complexe appelée Style.

Cette propriété contient une instance d'une classe appelée StylableControlStyles, qui contient plusieurs instances d'une classe appelée Style, où chacun détient des valeurs telles que BackColor, ForeColor, Image, Gradient (une autre classe que j'ai créé) etc.

J'ai également créé un concepteur de contrôle personnalisé pour permettre la modification de la propriété de style pour le contrôle utilisateur. Il montre un formulaire où chaque classe de style dans la propriété de style peut être édité facilement.

Maintenant, je veux fournir aux utilisateurs de ce contrôle un moyen facile de copier tout le contenu de la Style propriété d'une instance du contrôle utilisateur à une autre instance, au moment de la conception.

je pourrais, bien sûr, remplacer la méthode ToString() de l'objet StylableControlStyles pour créer une représentation de chaîne qui encapsule toutes les données enregistrées dans cet objet, mais cela créerait une chaîne de hugh et bien sûr aurait besoin de beaucoup de travail l'analyse dans le convertisseur de classe (actuellement j'utilise un ExpandableObjectConverter).
Je voudrais éviter cela si possible.

+0

Êtes-vous peut-être simplement à la recherche d'un moyen de cloner en profondeur ou de copier en profondeur une hiérarchie d'objets? Si oui, il y a déjà [plusieurs réponses] (http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-of-an-object-in-net-c-specifically) [ici sur SO] (http://stackoverflow.com/questions/78536/deep-cloning-objects) – jcb

+0

@jcb En fait, la partie colning est déjà écrite, ce n'est pas mon problème. Je suis à la recherche d'un moyen de fournir un support au moment de la conception pour les valeurs de copier-coller entre les contrôles d'un formulaire. Quelque chose comme une commande de balise active qui permet à l'utilisateur de choisir une autre instance du contrôle utilisateur et de copier son style dans le style de l'instance en cours. –

+0

@ZoharPeled, si vous avez déjà un formulaire de concepteur de contrôle personnalisé, ajoutez par exemple des boutons Style de copie et Appliquer des styles copiés. Le style copié peut être stocké dans un tampon (peut-être même dans le Presse-papiers) si le format est lisible par l'homme, les utilisateurs pourront insérer une valeur copiée dans .designer.cs fichier directement) – ASh

Répondre

0

En suivant les conseils de Ash dans les commentaires, j'ai utilisé un DesignerVerb pour copier et coller le Style depuis et vers un membre statique privé de type Style du Concepteur de contrôles.

Donc, dans ma classe de concepteur de contrôle J'ai:

private static ZControlStyle _CopiedStyle; 

Et ont ajouté ces verbes concepteur:

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

et les méthodes pour coller copie ans:

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; 
    } 
}