none
Smarttags RRS feed

  • Question

  • Bonjour,

    J'ai créé un contrôle utilisateur ou j'utilise les smarttags.

    Lorsque le contrôle est utilisé dans une application, la modification des propriétés via le smarttag sont bien transmises dans la fenêtre des propriétés du contrôle et la modification de la propriété sur le contrôle est bien visible.

    Lorsque l'application est lancée, la valeur de la propriété modifiée via le smarttag n'est plus appliquée sauf lors de la 1ère utilisation du smarttag avant le 1er lancement de l'application.

    Si je modifie les propriétés au départ de la fenêtre des propriétés cela fonctionne correctement au lancement de l'application.

    Il y a un problème de mise à jour des propriétés transmisses par le smattag lors du lancement de l'application alors qu'elles sont correctement affichées dans la fenêtre des propriétés.

    Je vous transmet une partie simplifié de mon code pour essai.

    Je peux également transmettre le programme d'application et le programme du composant utilisateur pour essai.

    Merci

    Imports System.ComponentModel.Design Imports System.ComponentModel Imports System.Drawing 'Cette classe représente les balises actives qu'affichera le SmartTag du contrôle en mode design. Public Class MultimètreDesignerActionList Inherits DesignerActionList Private m_Multimètre As Multimètre Private m_DesignerActionSrv As DesignerActionUIService = Nothing 'Constructeur. Public Sub New(ByVal component As IComponent) MyBase.New(component) m_Multimètre = CType(component, Multimètre) m_DesignerActionSrv = CType(GetService(GetType(DesignerActionUIService)), DesignerActionUIService) End Sub 'Associe les propriétés liées au SmartTag avec les propriétés du usercontrol multimètres Public Property ColorFond As Multimètre.SelectColorFond Get Return m_Multimètre.ColorFond End Get Set(ByVal Value As Multimètre.SelectColorFond) m_Multimètre.ColorFond = Value End Set End Property Public Overrides Function GetSortedActionItems() As DesignerActionItemCollection 'On crée une collection d'items pour notre SmartTag Dim items As New DesignerActionItemCollection 'Création de la catégorie items.Add(New DesignerActionHeaderItem("Couleurs")) 'Eléments - actions items.Add(New DesignerActionPropertyItem("ColorFond", "Couleur de fond :", "Couleurs", "Couleur de fond.")) Return items

    End Function

    End Class

    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.Windows.Forms
    Imports System.ComponentModel
    Imports System.Windows.Forms.Design
    
    'ATTENTION le contrôle n'est pas utilisable avec le framework 4 client profile
    '-----------------------------------------------------------------------------
    
    <ToolboxBitmap(GetType(Multimètre), "Multimètre.ico")>
    <Designer(GetType(MultimètreDesigner))> _
    Public Class Multimètre
    
    #Region "Propriétés"
        <DefaultValue(SelectColorFond.Défaut), Category("Multimètre"), Description("Couleur de fond.")> _
        Public Property ColorFond As SelectColorFond
            Get
                Return m_ColorFond
            End Get
            Set(ByVal Value As SelectColorFond)
                If Value <> m_ColorFond Then
                    m_ColorFond = Value
                    Me.Invalidate()
                End If
            End Set
        End Property
    
    #End Region
    
        'Couleur de fond possible
        Enum SelectColorFond
            Défaut
            Blanc
            Bleu
            Bleu_Clair
            Jaune
            Orange
            Rouge
            Vert
            Noir
        End Enum
    
        Dim m_ColorFond As SelectColorFond = SelectColorFond.Défaut
    
        Private Sub Multimètre_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    
            Dim gr As Graphics = e.Graphics
            Dim ColorFond As Color
    
            'Couleur de fond et de l'affichage
            Select Case m_ColorFond
                Case SelectColorFond.Défaut
                    ColorFond = Color.FromArgb(255, 165, 167, 146)
                Case SelectColorFond.Blanc
                    ColorFond = Color.White
                Case SelectColorFond.Bleu
                    ColorFond = Color.FromArgb(255, 30, 50, 130)
                Case SelectColorFond.Bleu_Clair
                    ColorFond = Color.FromArgb(255, 4, 165, 228)
                Case SelectColorFond.Jaune
                    ColorFond = Color.FromArgb(255, 234, 234, 0)
                Case SelectColorFond.Orange
                    ColorFond = Color.FromArgb(255, 240, 128, 46)
                Case SelectColorFond.Rouge
                    ColorFond = Color.FromArgb(255, 228, 34, 34)
                Case SelectColorFond.Vert
                    ColorFond = Color.Green
                Case SelectColorFond.Noir
                    ColorFond = Color.Black
            End Select
    
            'Affiche la couleur de fond
            Me.BackColor = ColorFond
    
        End Sub
    
    End Class
    


    lundi 18 avril 2016 08:35

Réponses

  • Bonjour,

    Pour résoudre le problème il faut ajouter dans la classe 'Public Class MultimètreDesignerActionList' la fonction suivante :

    'Récupère les propriétés du usercontrol multimètre et vérifie si elles sont correctement appelées

        Private Function GetPropertyByName(ByVal propName As String) As PropertyDescriptor
            Dim prop As PropertyDescriptor

            prop = TypeDescriptor.GetProperties(m_Multimètre)(propName)
            If prop Is Nothing Then
                Throw New ArgumentException("Propriété du contrôle Multimètre non trouvée!", propName)
            Else
                Return prop
            End If
        End Function

    Pour chaque propriété dans chaque stockage de la valeur de la propriété on fait appel à la fonction et on affecte la nouvelle valeur donnée par la balise du smarttag au composant.           

    Public Property ColorFond As Multimètre.SelectColorFond
            Get
                Return m_Multimètre.ColorFond
            End Get
            Set(ByVal Value As Multimètre.SelectColorFond)
                'Vérifie le nom de la propriété et affecte la valeur à la propriété du usercontrol multimètre.
                GetPropertyByName("ColorFond").SetValue(m_Multimètre, Value)
            End Set
        End Property

    dimanche 8 mai 2016 16:26

Toutes les réponses

  • Bonjour, Jacky Perpète,


    Avez-vous appelé la méthode DesignerActionUIService.Refresh Method (IComponent) pour mettre à jour le contenu de la balise active ?
    Je vous remercie par avance de votre retour.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 19 avril 2016 11:14
    Modérateur
  • Bonjour Teodora,

    J'ai modifie mon programme afin d'utiliser la méthode DesignerActionUIService.Refresh. Cela ne change rien au problème.

    Si je modifie la propriété à l'aide de la fenêtre Smarttag, la couleur de fond du composant est changée. Dans la fenêtre de propriétés, ma propriété personnalisée ColorFond est également changée de même que la propriété backcolor attribuée par programme. Mais lors de l'exécution de l'application la couleur du composant ne se modifie pas.

    Si dans mon application, par programme, j'affiche la valeur de la propriété ColorFond, celle-ci ne correspond pas à la valeur de la propriété de départ du composant.

    Il n'y a donc pas de mise à jour effective de la propriété au lancement de l'application lors d'un changement par la balise du Smarttag.

    Par contre cela fonctionne correctement à partir de la fenêtre de propriété.

    Merci

    Jacky


    mercredi 27 avril 2016 06:12
  • Bonjour,

    Pour résoudre le problème il faut ajouter dans la classe 'Public Class MultimètreDesignerActionList' la fonction suivante :

    'Récupère les propriétés du usercontrol multimètre et vérifie si elles sont correctement appelées

        Private Function GetPropertyByName(ByVal propName As String) As PropertyDescriptor
            Dim prop As PropertyDescriptor

            prop = TypeDescriptor.GetProperties(m_Multimètre)(propName)
            If prop Is Nothing Then
                Throw New ArgumentException("Propriété du contrôle Multimètre non trouvée!", propName)
            Else
                Return prop
            End If
        End Function

    Pour chaque propriété dans chaque stockage de la valeur de la propriété on fait appel à la fonction et on affecte la nouvelle valeur donnée par la balise du smarttag au composant.           

    Public Property ColorFond As Multimètre.SelectColorFond
            Get
                Return m_Multimètre.ColorFond
            End Get
            Set(ByVal Value As Multimètre.SelectColorFond)
                'Vérifie le nom de la propriété et affecte la valeur à la propriété du usercontrol multimètre.
                GetPropertyByName("ColorFond").SetValue(m_Multimètre, Value)
            End Set
        End Property

    dimanche 8 mai 2016 16:26