2014-05-02 5 views
1

Je veux créer un contrôle qui permet une propriété à définir au moment de la conception qui, lorsqu'il configure le jeu de contrôle (par exemple définit un tas de propriétés). Idéalement, la configuration si une instance d'une classe de configuration (un foncteur), une fonction, ou même un nom de configuration (par exemple une chaîne) serait finalement exécuter du code sur le contrôle lui-même. Ce code serait écrit par les développeurs utilisant le contrôle. Ils définiraient un certain nombre de configurations, puis dans le concepteur la propriété Configuration du contrôle afficheraient soit un menu déroulant des choix acceptables ou permettre au développeur de clé dans une valeur (par exemple, le nom de la configuration). L'effet souhaité est que la définition de la propriété provoque immédiatement le redessin du contrôle dans le concepteur à la lumière de ses nouveaux paramètres de propriété.Comment créer un contrôle .NET avec un mécanisme de configuration au moment du design?

Public Property Configuration As String 
    Get 
     Return m_Configuration 
    End Get 
    Set(value As String) 
     m_Configuration = value 
     Dim Configure As Action(Of CustomControl) = Configurations(value) 
     Configure(Me) //apply custom code written by user of library 
    End Set 
End Property 

J'ai essayé créer et charger un dictionnaire partagé avec des configurations (utilisés dans le morceau de code ci-dessus), mais je ne pouvais pas trouver un moyen de permettre le dictionnaire à charger par un développeur afin que son les configurations seraient déjà dans le dictionnaire lorsque la propriété ci-dessus a été définie dans le concepteur. Cela fonctionnait si je définissais les configurations dans la bibliothèque elle-même, mais cela va à l'encontre du but de la personnalisation.

//Where and how would the developer cause this to be executed... 
Configurations.Add("DoSomethingWonderful", AddressOf DoSomethingWonderful) 

//...so that it would be in place for use at design time? 
Me.CustomControl.Configuration = "DoSomethingWonderful" 

J'ai essayé de faire de la propriété un Action(Of CustomControl) et d'exposer certaines actions mondiales, mais le concepteur ne permettait pas cette propriété à définir. J'avais espéré que la propriété afficherait une liste des méthodes connues Action(Of CustomControl).

Me.CustomControl.Configuration = AddressOf DoSomethingWonderful 

J'ai essayé de faire le bien prendre une instance partagée d'une classe de configuration (à savoir a functor), mais le concepteur ne permettait pas cette propriété à définir soit. Encore une fois, j'avais espéré que la propriété afficherait une liste d'instances de configuration connues.

Me.CustomControl.Configuration = DoSomethingWonderful 'configuration instance 

L'héritage du contrôle personnalisé n'est pas une option. Hériter et remplacer une classe de configuration serait bien. Idéalement, je suis après l'approche la plus simple qui répond aux exigences. Toutes ces approches fonctionneraient si nous attendions jusqu'à l'exécution, mais la clé est que nous avons quelque chose qui fonctionne au moment du design. En particulier, nous avons un contrôle de grille personnalisé dans lequel nous définissons des tonnes de colonnes et de paramètres. Nous avons généralement besoin d'afficher une grille d'adresses qui a un ensemble prédéfini de colonnes et de paramètres. La grille d'adresses est utilisée à plusieurs endroits dans l'application. Nous avons d'autres grilles avec des colonnes prédéfinies et des paramètres qui sont utilisés dans l'application. Les développeurs ont pris pour copier et coller la grille d'un écran à l'autre. Cela est logique car la gestion ne souhaite pas que nous héritions de différentes variantes de la grille de base (par exemple, AddressGrid, PersonGrid, etc.). Le problème est lorsque nous changeons la façon dont nous affichons les adresses, nous devons reconfigurer toutes les grilles d'adresses à travers l'application. Je l'ai maintenant fonctionnant de sorte que si vous ...

Me.Addresses.Configuration = "Address" 

... la grille entière est correctement configurée. Le seul problème est que nous ne voulons pas stocker les configurations dans la bibliothèque de contrôle elle-même. Les applications individuelles devraient définir leurs propres configurations. L'application d'hébergement a juste besoin d'un moyen de relayer ces configurations à la bibliothèque/classe de grille de sorte que lorsque la propriété ci-dessus est dans le concepteur de la bibliothèque reconnaît la configuration et met à jour le concepteur de façon appropriée.

+0

Est-ce que cela doit vraiment être dans le concepteur? Vous semblez vouloir une manière programmatique de configurer un contrôle ... Et vous avez ça, c'est le codebehind. Vous pouvez appliquer la méthode de configuration que vous voulez après InitializeComponent(). –

+0

Sauf si vous avez l'intention d'écrire votre propre concepteur, je suppose que vous voulez utiliser un outil de conception existant. Cependant, vous n'avez pas spécifié lequel. Dans Visual Studio, vous avez Windows Forms et WPF. –

+0

Notre boutique préfère les propriétés à définir dans les concepteurs de sorte que les formulaires de conception ressemblent à ce qu'ils vont regarder au moment de l'exécution. Si nous attendons jusqu'à l'exécution pour définir ces propriétés, les concepteurs ne correspondent pas. – Mario

Répondre

0

Si je vous comprends bien, vous avez une bibliothèque, qui contient le contrôle qui a quelques propriétés publiques, qui peuvent être définies dans le concepteur.Vous souhaitez autoriser les utilisateurs de votre bibliothèque à définir des ensembles de valeurs de propriété standard, qui peuvent être appliqués au contrôle au moment du design.

Vous souhaitez effectuer cette opération car il est très important que les contrôles du concepteur soient identiques à ceux de l'exécution et que vous ne fassiez pas confiance aux utilisateurs de votre bibliothèque pour qu'ils appliquent correctement les paramètres de contrôle sur une propriété base.

Il y a un paradoxe inhérent dans ce que vous demandez, parce que vous espérez obtenir que votre bibliothèque exécute du code externe arbitraire, qui pourrait même ne pas être encore compilé. Le code de configuration du concepteur est en fait interprété par Visual Studio.

Il existe quelques bibliothèques de contrôle (par exemple: DevExpress XtraGrid) qui peuvent enregistrer et restaurer la mise en page à l'aide d'un fichier XML. Ceux-ci fonctionnent au moment du design pour définir les différentes propriétés d'un contrôle à un état précédemment enregistré. Afin de mettre en œuvre quelque chose comme ça, vous devez créer une extension de concepteur pour votre contrôle. Mais en réalité, vous allez juste faire beaucoup de travail pour un bénéfice réel très faible. Un hack autour de ceci serait d'avoir juste une bibliothèque d'extraits que les programmeurs peuvent simplement coller manuellement dans le code généré par le Concepteur de Formulaires.

+0

J'ai ajouté plus d'informations au bas de la question. Peut-être que j'étais trop étroit pour éviter les détails. – Mario

+0

Chargement des paramètres de colonne à partir de fichiers XML (ou un autre format de votre choix) semble être la voie à suivre. Voir la réponse pour un lien sur comment. –

Questions connexes