Como: Criar um editor de valor de propriedade de caixa de diálogo

O exemplo de código a seguir mostra como implementar um personalizado caixa de diálogodepropriedade de valor editor para o WPF Designer for Visual Studio. Para uma soluçãocompleta, consulte o exemplo de Diálogo Editor de propriedade de Valor da Exemplos de extensibilidade doWPF Designer site.  

Exemplo

Este tópico mostra como criar uma caixa de diálogo propriedade valor editor que exibe um em aberto arquivo de caixa de diálogo quando um personalizado nome de arquivo propriedade é clicado no janela Propriedades.

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>

Compilando o código

Compile the previous example code in three separate assemblies.

Compiling the Custom Control

  1. Em Visual Studio, criar um nova biblioteca de controle de usuário do WPF projeto na chamada C# CustomControlLibrary.

  2. Alterar todas as ocorrências de "usercontrol1" para "democontrol".

  3. Replace the existing code in the DemoControl class with the code listed earlier.

  4. Build the solution.

O Valor de propriedade caixa PersonalizarDiálogo Editor de compilação.

  1. Em Visual Studio, adicione um novo biblioteca de controle de usuário do WPF projeto chamado CustomControlLibrary.Design à solução.

  2. Definir o caminho de saída do projeto"... \CustomControlLibrary\bin\Debug\ ".

  3. Exclua UserControl1.xaml e UserControl1.xaml.cs do projeto.

  4. Add references to the following assemblies.

    • Microsoft.Windows.Design.Extensibility

    • Microsoft.Windows.Design.Interaction

  5. Add a reference to the CustomControlLibrary project.

  6. Adicionar um dicionário de recurso chamado EditorResources para o projeto.

  7. Substitua o XAML existente no EditorResources.xaml com o XAML listado anteriormente.

  8. Adicionar uma nova classe chamada EditorResources para o projeto.

  9. Substitua o código existente na EditorResources com o código listado anteriormente.

  10. Adicionar uma nova classe chamada FileBrowserDialogPropertyValueEditor para o projeto.

  11. Replace the existing code in the FileBrowserDialogPropertyValueEditor class with the code listed earlier.

  12. Adicionar uma nova classe chamada metadados para o projeto.

  13. Replace the existing code in the Metadata class with the code listed earlier.

  14. Build the solution.

Compiling the Test Application

  1. Em Visual Studio, adicione um novo projeto de aplicativo do WPF à solução.

  2. Add a reference to the CustomControlLibrary assembly or project.

  3. No modo XAML para MainWindow. XAML, substituir o XAML existente com o XAML listado anteriormente.

  4. No MainWindow.xaml.cs, comente a chamada para InitializeComponent.

  5. Recrie a solução.

  6. No modo de exibição de Design, clique no DemoControl para selecionar um proprietário. Talvez você precise clicar na barra de informações na parte superior do designer para recarregar o modo de exibição.

  7. No janela Propriedades, clique no botão ao lado do nome de arquivo propriedade.

    O Abrir caixa de diálogo aparece.

  8. Navegue até um arquivo e clique em Abrir.

    O nome do arquivo é exibido na nome de arquivo propriedade do janela Propriedades e o FileName propriedade é atribuída no modo XAML .

Consulte também

Referência

ItemPolicy

PrimarySelectionPolicy

Outros recursos

Conceitos de Extensibilidade Avançada

Extensibilidade do WPF Designer

WPF Exemplos de extensibilidade Designer