Partager via


Procédure pas à pas : modification du comportement d'une propriété au moment du design

Lorsque vous utilisez l'extensibilité pour personnaliser le Concepteur WPF pour Visual Studio, vous créez souvent des contrôles personnalisés. Toutefois, vous souhaitez parfois qu'une propriété du contrôle se comporte différemment au moment du design qu'au moment de l'exécution, tout en permettant à l'utilisateur de définir normalement la valeur de la propriété. Par exemple, vous souhaitez que l'utilisateur puisse affecter la valeur false à la propriété visible d'un contrôle, mais celui-ci doit rester visible au moment du design.

Dans cette procédure pas à pas, vous créez un Button personnalisé et modifiez le comportement des propriétés Background et Content. Pour ce faire, vous créez un DesignModeValueProvider et l'attachez à votre contrôle personnalisé. DesignModeValueProvider capture les modifications de propriété apportées par l'utilisateur, vous insérez votre propre logique dans la méthode TranslatePropertyValue et DesignModeValueProvider passe les nouvelles valeurs au concepteur.

Important

Lorsque vous utilisez cette technique, le comportement d'une propriété dans le concepteur ne correspond pas à la valeur de la propriété en mode XAML. En effet, le mode XAML affiche la valeur que l'utilisateur a entrée au moment du design. La valeur en mode XAML représente le comportement de la propriété au moment de l'exécution.

Dans cette procédure pas à pas, vous allez effectuer les tâches suivantes :

  • créer un projet de bibliothèque de contrôles personnalisés WPF ;

  • créer un DesignModeValueProviderpersonnalisé ;

  • créer un contrôle bouton personnalisé ;

  • attacher DesignModeValueProvider au contrôle personnalisé ;

  • créer une application de test ;

  • tester le contrôle personnalisé.

Notes

Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Utilisation des paramètres.

Composants requis

Pour exécuter cette procédure pas à pas, vous devez disposer des composants suivants :

  • Visual Studio 2010

Création d'un projet de bibliothèque de contrôles personnalisés WPF

Pour créer le projet

  1. Créez un projet de bibliothèque de contrôles personnalisés WPF dans Visual Basic ou Visual C# nommé CustomButton.

    Le code pour CustomControl1 s'ouvre dans l'éditeur de code.

  2. Ajoutez une référence à l'assembly suivant.

    • Microsoft.Windows.Design.Extensibility
  3. Dans l'Explorateur de solutions, remplacez le nom du fichier de code par CustomButton.cs ou CustomButton.vb.

    Si une boîte de message s'affiche pour demander si vous souhaitez renommer toutes les références dans ce projet, cliquez sur Oui.

  4. Dans le menu Générer, cliquez sur Générer la solution.

Création d'un DesignModeValueProvider personnalisé

Dans cette procédure, vous créez un DesignModeValueProvider personnalisé. Dans la méthode TranslatePropertyValue, vous modifiez la propriété Content de Button afin qu'il s'affiche en majuscules dans le concepteur. Vous modifiez également la propriété Background de Button afin qu'il s'affiche avec la couleur système par défaut dans le concepteur. Ces modifications concernent le concepteur uniquement. Au moment de l'exécution, les propriétés Content et Background s'affichent avec les valeurs définies par l'utilisateur.

Notes

Dans cette procédure, vous créez un DesignModeValueProvider qui gère deux propriétés différentes. Vous pouvez également créer plusieurs objets DesignModeValueProvider pour gérer des propriétés différentes.

Pour créer un DesignModeValueProvider personnalisé

  1. Ajoutez au projet CustomButton une nouvelle classe nommée CustomButtonDesignModeValueProvider.cs ou CustomButtonDesignModeValueProvider.vb.

    La nouvelle classe s'ouvre dans l'éditeur de code.

  2. Ajoutez les espaces de noms suivants au début du fichier. Remplacez les espaces existants, le cas échéant.

    
    Imports System
    Imports System.Windows                  'SystemColors
    Imports System.Windows.Media            'SolidColorBrush
    Imports System.Windows.Controls         'Button
    Imports Microsoft.Windows.Design.Model  'DesignModeValueProvider
    Imports Microsoft.Windows.Design.Metadata
    
    
    
    using System;
    using System.Windows;                   //SystemColors
    using System.Windows.Media;             //SolidColorBrush
    using System.Windows.Controls;          //Button
    using Microsoft.Windows.Design.Model;
    using Microsoft.Windows.Design.Metadata;   //DesignModeValueProvider
    
  3. Modifiez la classe CustomButtonDesignModeValueProvider afin qu'elle hérite de DesignModeValueProvider.

    
    Public Class CustomButtonDesignModeValueProvider
        Inherits DesignModeValueProvider
    
    End Class
    
    
    class CustomButtonDesignModeValueProvider : DesignModeValueProvider
    {
    }
    
  4. Ajoutez un constructeur à la classe. Dans le constructeur, vous identifiez les propriétés à capturer.

    
    Public Sub New()
        Properties.Add(GetType(Button), "Content")
        Properties.Add(GetType(Button), "Background")
    End Sub
    
    
    public CustomButtonDesignModeValueProvider()
    {
        Properties.Add( typeof(Button), "Content");
        Properties.Add(typeof(Button), "Background");
    }
    
  5. Substituez la méthode TranslatePropertyValue de la classe. C'est ici que vous spécifiez le nouveau comportement des propriétés au moment du design.

    
    Public Overrides Function TranslatePropertyValue( _
        ByVal item As ModelItem, _
        ByVal identifier As PropertyIdentifier, _
        ByVal value As Object) As Object
    
        If identifier.DeclaringType Is GetType(Button) And _
           identifier.Name = "Content" Then
    
            Return value.ToString().ToUpper()
        End If
    
        If identifier.DeclaringType Is GetType(Button) And _
           identifier.Name = "Background" Then
    
            Return New SolidColorBrush(SystemColors.ControlColor)
        End If
    
        Return MyBase.TranslatePropertyValue(item, identifier, value)
    End Function
    
    
    public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value)
    {
        if (identifier.DeclaringType == typeof( Button ) &&
            identifier.Name == "Content" )
        {
            return ((string)value).ToUpper();
        }
    
        if (identifier.DeclaringType == typeof(Button) &&
            identifier.Name == "Background")
        {
            return new SolidColorBrush(SystemColors.ControlColor);
        }
    
        return base.TranslatePropertyValue(item, identifier, value);
    }
    
  6. Dans le menu Générer, cliquez sur Générer la solution.

Création d'un contrôle bouton personnalisé

Dans cette procédure, vous créez le contrôle personnalisé. Vous créez un contrôle personnalisé simple qui hérite de Button, mais qui ne contient aucune fonctionnalité personnalisée supplémentaire.

Pour créer un contrôle bouton personnalisé

  1. Ouvrez la classe CustomButton dans l'éditeur de code.

  2. Ajoutez les espaces de noms suivants au début du fichier. Remplacez les espaces existants, le cas échéant.

    
    Imports System.Windows.Controls             'Button
    Imports Microsoft.Windows.Design.Features   'Feature
    
    
    using System.Windows.Controls;              //Button
    using Microsoft.Windows.Design.Features;    //Feature
    
  3. Remplacez la classe existante par la suivante.

    
    Public Class CustomButton
        Inherits Button
    
        Shared Sub New()
    
        End Sub
    End Class
    
    
    public class CustomButton : Button
    {
        static CustomButton()
        {
        }
    }
    
  4. Dans le menu Générer, cliquez sur Générer la solution.

Attachement de DesignModeValueProvider au contrôle personnalisé

Dans cette procédure, vous attachez DesignModeValueProvider au contrôle personnalisé à l'aide de l'attribut FeatureAttribute.

Notes

Vous pouvez également attacher un DesignModeValueProvider à un contrôle personnalisé à l'aide des métadonnées au moment du design personnalisées fournies. Pour plus d'informations, consultez Mise à disposition de métadonnées au moment du design.

Pour attacher DesignModeValueProvider au contrôle personnalisé

  1. Dans l'éditeur de code, localisez la déclaration de la classe CustomButton. Elle doit se présenter comme suit :

    
    Public Class CustomButton
        Inherits Button
    
    
    public class CustomButton : Button
    
  2. Ajoutez un attribut Feature à la déclaration de classe et spécifiez DesignModeValueProvider.

    <Feature(GetType(CustomButtonDesignModeValueProvider))> _
    Public Class CustomButton
        Inherits Button
    
    [Feature(typeof(CustomButtonDesignModeValueProvider))]
    public class CustomButton : Button
    
  3. Dans le menu Générer, cliquez sur Générer la solution.

Création d'une application de test

Pour créer une application de test

  1. Ajoutez à la solution un nouveau projet d'application WPF dans Visual C# nommé CustomButtonTestApplication.

    MainWindow.xaml s'ouvre dans le Concepteur WPF.

  2. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis cliquez sur Définir comme projet de démarrage.

  3. Dans le menu Projet, cliquez sur Ajouter une référence, puis utilisez l'onglet Projets pour ajouter une référence au projet CustomButton.

  4. Dans le menu Générer, cliquez sur Générer la solution.

Test du contrôle personnalisé

Pour tester le contrôle personnalisé

  1. Dans la vue XAML pour MainWindow.xaml, remplacez le code XAML existant par le code suivant :

    <Window x:Class="CustomButtonTestApplication.MainWindow"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cb="clr-namespace:CustomButton;assembly=CustomButton"
        Title="MainWindow" Height="300" Width="300">
        <Grid>
            <cb:CustomButton Height="75" Width="100">Button1</cb:CustomButton>
        </Grid>
    </Window>
    
  2. En mode Design, sélectionnez le bouton. Si nécessaire, cliquez sur la barre d'informations située dans la partie supérieure du concepteur pour recharger l'affichage.

  3. Dans la fenêtre Propriétés, recherchez la propriété Background.

  4. Tapez Red, puis appuyez sur Entrée.

    Le code XAML est mis à jour en fonction du code Background="Red", mais la couleur du bouton ne change pas en mode Design.

  5. Dans la fenêtre Propriétés, recherchez la propriété Content.

  6. Tapez Hello World, puis appuyez sur Entrée.

    Le code XAML est mis à jour en fonction du contenu Hello World, mais le bouton affiche le texte HELLO WORLD en mode Design.

  7. Dans le menu Déboguer, cliquez sur Démarrer le débogage.

    L'application démarre et la fenêtre apparaît. Le bouton est rouge et contient le texte Hello World au moment de l'exécution.

  8. Fermez la fenêtre.

Voir aussi

Tâches

Comment : modifier le comportement d'une propriété au moment du design

Comment : déterminer si un contrôle personnalisé est un contrôle DTC ou un contrôle runtime

Autres ressources

Comportement au moment du design et au moment de l'exécution

Fonctionnement de l'extensibilité du Concepteur WPF

Extensibilité du Concepteur WPF

Mise à disposition de métadonnées au moment du design