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
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
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
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
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
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 Class
L'é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.

Nom : Capture.PNG
Affichages : 290
Taille : 6,2 Ko

Je sais qu'on ne peut pas modifier directement les sous-propriétés de cette manière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
MonObjet.PropriétéMonObjet.Propriété1 = 5
On obtient l'erreur : Cette expression est une valeur et ne peut donc pas être la cible d'une assignation
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Me.Size = New System.Drawing.Size(100, 200)
Connaîtriez-vous un moyen de réaliser ce que je souhaite ?

Cordialement,
E__Man.