Comment : créer un éditeur de valeurs de propriété de boîte de dialogue

Mise à jour : novembre 2007

L'exemple de code suivant indique comment implémenter un éditeur de valeurs de propriété de boîte de dialogue personnalisé pour Concepteur Windows Presentation Foundation (WPF) pour Visual Studio. 

Exemple

Cette rubrique indique comment créer un éditeur de valeurs de propriété de boîte de dialogue qui affiche une boîte de dialogue Ouvrir un fichier lorsque l'utilisateur clique sur une propriété FileName personnalisée dans la fenêtre Propriétés.

using System;
using System.ComponentModel;
using System.Windows.Controls;
using System.Windows;

namespace CustomControlLibrary
{
    public partial class DemoControl : UserControl
    {
        public DemoControl()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty FileNameProperty = DependencyProperty.Register(
            "FileName", 
            typeof(string), 
            typeof(DemoControl), 
            new PropertyMetadata("File name not set."));

        public string FileName
        {
            get
            {
                return (string)this.GetValue(FileNameProperty);
            }

            set
            {
                this.SetValue(FileNameProperty, value);
            }
        }
    }
}
<ResourceDictionary xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:PropertyEditing="clr-namespace:Microsoft.Windows.Design.PropertyEditing;assembly=Microsoft.Windows.Design"
                    xmlns:Local="clr-namespace:CustomControlLibrary.Design"
                    x:Class="CustomControlLibrary.Design.EditorResources">

    <DataTemplate x:Key="FileBrowserInlineEditorTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <TextBox Grid.Column="0" Text="{Binding StringValue}"/>
            <PropertyEditing:EditModeSwitchButton Grid.Column="1"/>
        </Grid>
    </DataTemplate>

</ResourceDictionary>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CustomControlLibrary.Design
{
    using System.Windows;
    public partial class EditorResources : ResourceDictionary
    {
        public EditorResources()
            : base()
        {
            InitializeComponent();
        }
    }
}
using System;
using System.ComponentModel;
using System.Windows;
using Microsoft.Windows.Design.Metadata;
using Microsoft.Windows.Design.PropertyEditing;
using Microsoft.Win32;

namespace CustomControlLibrary.Design
{
    public class FileBrowserDialogPropertyValueEditor : DialogPropertyValueEditor
    {
        private EditorResources res = new EditorResources();

        public FileBrowserDialogPropertyValueEditor()
        {
            this.InlineEditorTemplate = res["FileBrowserInlineEditorTemplate"] as DataTemplate;
        }

        public override void ShowDialog(
            PropertyValue propertyValue,
            IInputElement commandSource)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Multiselect = false;

            if (ofd.ShowDialog() == true)
            {
                propertyValue.StringValue = ofd.FileName;
            }
        }
    }
}
using System;
using System.ComponentModel;
using System.Windows;
using Microsoft.Windows.Design.Metadata;
using Microsoft.Windows.Design.PropertyEditing;

namespace CustomControlLibrary.Design
{
    internal class Metadata : IRegisterMetadata
    {
        // Called by the designer to register any design-time metadata.
        public void Register()
        {
            AttributeTableBuilder builder = new AttributeTableBuilder();

            builder.AddCustomAttributes
                ( typeof( CustomControlLibrary.DemoControl), 
                "FileName",
                PropertyValueEditor.CreateEditorAttribute(
                    typeof(FileBrowserDialogPropertyValueEditor)));

            MetadataStore.AddAttributeTable(builder.CreateTable());
        }
    }
}
<Window x:Class="WpfApplication1.Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ccl="clr-namespace:CustomControlLibrary;assembly=CustomControlLibrary"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ccl:DemoControl FileName="" />
    </Grid>
</Window>

Compilation du code

Compilez l'exemple de code précédent dans trois assemblys distincts.

Compilation du contrôle personnalisé

  1. Dans Visual Studio, créez un projet de bibliothèque de contrôles utilisateur WPF en C# nommé CustomControlLibrary.

  2. Remplacez toutes les occurrences de "UserControl1" par "DemoControl".

  3. Remplacez le code existant dans la classe DemoControl par le code indiqué précédemment.

  4. Générez la solution.

Compilation de l'éditeur de valeurs de propriété de boîte de dialogue personnalisé

  1. Dans Visual Studio, ajoutez à la solution un nouveau projet de bibliothèque de contrôles utilisateur WPF nommé CustomControlLibrary.Design.

  2. Le chemin de sortie du projet doit être "..\CustomControlLibrary\bin\Debug\".

  3. Supprimez UserControl1.xaml et UserControl1.xaml.cs du projet.

  4. Ajoutez des références aux assemblys suivants.

    • Microsoft.Windows.Design

    • Microsoft.Windows.Design.Extensibility

    • Microsoft.Windows.Design.Interaction

  5. Ajoutez une référence au projet CustomControlLibrary.

  6. Ajoutez au projet un dictionnaire de ressources nommé EditorResources.

  7. Remplacez le code XAML existant dans EditorResources.xaml par le code XAML indiqué précédemment.

  8. Ajoutez au projet une nouvelle classe nommée EditorResources.

  9. Remplacez le code existant dans EditorResources par le code indiqué précédemment.

  10. Ajoutez au projet une nouvelle classe nommée FileBrowserDialogPropertyValueEditor.

  11. Remplacez le code existant dans la classe FileBrowserDialogPropertyValueEditor par le code indiqué précédemment.

  12. Ajoutez au projet une nouvelle classe nommée Metadata.

  13. Remplacez le code existant dans la classe Metadata par le code indiqué précédemment.

  14. Générez la solution.

Compilation de l'application de test

  1. Dans Visual Studio, ajoutez un nouveau projet d'application WPF à la solution.

  2. Ajoutez une référence à l'assembly ou au projet CustomControlLibrary.

  3. Dans l'affichage de Window1.xaml en mode XAML, remplacez le code XAML par le code XAML indiqué précédemment.

  4. Dans Window1.xaml.cs, commentez l'appel à InitializeComponent.

  5. Régénérez la solution.

  6. En mode Design, cliquez sur DemoControl pour le sélectionner. Il peut s'avérer nécessaire de cliquer sur la barre d'informations située dans la partie supérieure du concepteur pour recharger la vue.

  7. Dans la fenêtre Propriétés, cliquez sur le bouton situé en regard de la propriété FileName.

    La boîte de dialogue Ouvrir s'affiche.

  8. Accédez à un fichier et cliquez sur Ouvrir.

    Le nom de fichier s'affiche dans la propriété FileName de la fenêtre Propriétés et la propriété FileName est assignée en mode XAML.

Voir aussi

Référence

ItemPolicy

PrimarySelectionPolicy

Autres ressources

Concepts d'extensibilité avancés

Extensibilité du concepteur WPF