Como: Criar um caixa de diálogo valor da propriedade Editor
O exemplo de código a seguir mostra como implementar uma caixa de diálogo personalizada valor da propriedade editor para o Windows Presentation Foundation (WPF) Designer for Visual Studio.
Exemplo
Este tópico mostra como criar uma caixa de diálogo editor de valor da propriedade caixa que exibe uma caixa de diálogo em em aberto arquivo quando um personalizado FileNamepropriedade é clicada na 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"
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>
Compilando o código
Compile o código exemplo anterior em três conjuntos separados.
Compilando o controle personalizado
In Visual Studio, crie um novo projeto WPF usuário controle biblioteca no translation from VPE for Csharp chamado CustomControlLibrary.
Altere todas as ocorrências de "UserControl1" para "DemoControl".
Substitua o código existente na classe DemoControl com o código listado anteriormente.
Crie a solução.
Compilando o Editor de valor personalizado diálogo caixa de propriedade
In Visual Studio, adicione um novo projeto WPF usuário controle biblioteca chamado CustomControlLibrary.Design à solução.
conjunto caminho de saída do projeto para "..\CustomControlLibrary\bin\depurar\ ".
Exclua UserControl1.xaml e UserControl1.xaml.cs do projeto.
Adicione referências para os seguintes conjuntos de módulos (assemblies) :
Microsoft.Windows.Design
Microsoft.Windows.Design.Extensibility
Microsoft.Windows.Design.Interaction
Adicione uma referência ao projeto CustomControlLibrary.
Adicionar um dicionário de recurso chamado EditorResources para o projeto.
substituir o XAML existente no EditorResources.xaml com o XAML listado anteriormente.
Adicione uma nova classe chamada EditorResources para o projeto.
substituir o código existente no EditorResources com o código listado anteriormente.
Adicione uma nova classe chamada FileBrowserDialogPropertyValueEditor para o projeto.
Substitua o código existente na classe FileBrowserDialogPropertyValueEditor com o código listado anteriormente.
Adicione uma nova classe chamada Metadados para o projeto.
Substitua o código existente na classe Metadata com o código listado anteriormente.
Crie a solução.
Compilar o aplicativo de teste
In Visual Studio, adicione um novo projeto WPF aplicativo à solução.
Adicione uma referência ao assembly CustomControlLibrary ou projeto.
Na exibição XAML para Window1.XAML, substitua o XAML existente com o XAML listado anteriormente.
Em Window1.xaml.cs, comente a telefonar para InitializeComponent.
Recrie a solução.
No modo de exibição de design, clicar o DemoControl para selecioná-lo. Talvez seja necessário clicar na BAR de informações na parte superior do designer para recarregar o modo de exibição.
Na janela Propriedades, clicar no botão próximo à FileNamepropriedade .
The em aberto caixa de diálogo é exibida.
navegar até um arquivo e clicar em aberto.
nome de arquivo é exibido no FileName propriedade da janela Propriedades e o FileName propriedade é atribuída no modo de exibição XAML.