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.
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(). –
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. –
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