Bonjour,
Mon contrôle UserControl a une propriété d'un type personnalisé. Ce type est relativement similaire aux types Size ou Point, par exemple : son constructeur prend deux paramètres et il contient deux propriétés publiques.
J'ai réussi à l'afficher dans la fenêtre Propriétés (en bas à droite lorsqu'on utilise l'éditeur visuel).
En revanche, je ne parviens pas à :
- modifier les propriétés de mon objet (les propriétés sont modifiées jusqu'à ce qu'on ferme l'éditeur, mais le changement n'est pas sauvegardé dans le fichier Designer.vb),
- définir une valeur par défaut reconnue par l'éditeur.
EDIT : Après redémarrage de Visual Studio, ce deuxième problème semble résolu et la valeur par défaut est prise en compte.
Voici mon code :
MonObjetConverter.vb
MonObjet.vb
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Option Explicit On Option Strict On Imports System Imports System.ComponentModel Imports System.Globalization Imports System.Drawing Friend Class MonObjetConverter Inherits ExpandableObjectConverter ' Overrides the CanConvertFrom method of TypeConverter. ' The ITypeDescriptorContext interface provides the context for the ' conversion. Typically, this interface is used at design time to ' provide information about the design-time container. Public Overloads Overrides Function CanConvertFrom(context As ITypeDescriptorContext, sourceType As Type) As Boolean If sourceType Is GetType(String) Then Return True End If Return MyBase.CanConvertFrom(context, sourceType) End Function ' Overrides the ConvertFrom method of TypeConverter. Public Overloads Overrides Function ConvertFrom(context As ITypeDescriptorContext, culture As CultureInfo, value As Object) As Object If TypeOf value Is String Then Dim v As String() = CStr(value).Split(New String() {"; "}, StringSplitOptions.RemoveEmptyEntries) Return New MonObjet(Integer.Parse(v(0)), Integer.Parse(v(1))) End If Return MyBase.ConvertFrom(context, culture, value) End Function ' Overrides the ConvertTo method of TypeConverter. Public Overloads Overrides Function ConvertTo(context As ITypeDescriptorContext, culture As CultureInfo, value As Object, destinationType As Type) As Object If destinationType Is GetType(String) Then Return CType(value, MonObjet).Propriété1 & "; " & CType(value, MonObjet).Propriété2 End If Return MyBase.ConvertTo(context, culture, value, destinationType) End Function End Class
MonControle.vb
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Imports System.ComponentModel <TypeConverter(GetType(MonObjetConverter))> Public Structure MonObjet Public Sub New(ByVal p1 As Integer, ByVal p2 As Integer) Propriété1 = p1 Propriété2 = p2 End Sub <DefaultValue(1)> Public Property Propriété1 As Integer <DefaultValue(3)> Public Property Propriété2 As Integer End Structure
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Imports System.ComponentModel Public Class MonControle [...] <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), DefaultValue(GetType(MonObjet), "1; 3")> Public Property PropriétéMonObjet As New MonObjet(1, 3) [...] End ClassL'éditeur affiche la valeur 1; 3 en gras (comme si la valeur avait été modifiée) - mais les propriétés de l'objet ne sont pas en gras.
Lorsque j'appuie sur Réinitialiser, il affiche 0; 0 (toujours en gras).
Lorsque je ferme et que je rouvre l'éditeur, la valeur est à nouveau à 1; 3.
Je sais qu'on ne peut pas modifier directement les sous-propriétés de cette manière :
On obtient l'erreur : Cette expression est une valeur et ne peut donc pas être la cible d'une assignation
Code : Sélectionner tout - Visualiser dans une fenêtre à part MonObjet.PropriétéMonObjet.Propriété1 = 5
D'ailleurs, je ne sais pas pourquoi, car les propriétés ne sont pas en lecture seule.
Mais l'éditeur est capable de modifier la taille et la position des fenêtres, par exemple. Pour cela, il crée un nouvel objet qui prend les paramètres désirés.
Form1.Designer.vb
Connaîtriez-vous un moyen de réaliser ce que je souhaite ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Me.Size = New System.Drawing.Size(100, 200)
Cordialement,
E__Man.
Partager