Partager via


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

L'exemple de code suivant indique comment implémenter un éditeur de valeurs de propriété de boîte de dialogue personnalisé pour Concepteur WPF pour Visual Studio. Pour obtenir une solution complète, consultez l'exemple d'éditeur de valeur de propriété de boîte de dialogue sur le site WPF Designer Extensibility Samples

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.Interaction"
                    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;

// The ProvideMetadata assembly-level attribute indicates to designers
// that this assembly contains a class that provides an attribute table. 
[assembly: ProvideMetadata(typeof(CustomControlLibrary.Design.Metadata))]
namespace CustomControlLibrary.Design
{
    // Container for any general design-time metadata to initialize.
    // Designers look for a type in the design-time assembly that 
    // implements IProvideAttributeTable. If found, designers instantiate 
    // this class and access its AttributeTable property automatically.
    internal class Metadata : IProvideAttributeTable 
    {
        // Accessed by the designer to register any design-time metadata.
        public AttributeTable AttributeTable
        {
            get 
            {
                AttributeTableBuilder builder = new AttributeTableBuilder();

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

                return builder.CreateTable();
            }
        }
    }
}
<Window x:Class="WpfApplication1.MainWindow"
    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="MainWindow" 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. Affectez au chemin de sortie du projet la valeur \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.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 la vue XAML pour MainWindow.xaml, remplacez le code XAML existant par le code XAML répertorié précédemment.

  4. Dans MainWindow.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

WPF Designer Extensibility Samples