如何:创建对话框属性值编辑器
[本文档仅供预览,在以后的发行版中可能会发生更改。包含的空白主题用作占位符。]
下面的代码示例演示如何为适用于 Visual Studio 的 WPF 设计器实现自定义对话框属性值编辑器。有关完整的解决方案,请参见 WPF Designer Extensibility Samples(WPF 设计器扩展性示例)网站上的“Dialog Property Value Editor”(对话框属性值编辑器)示例。
示例
本主题演示如何创建一个对话框属性值编辑器,当在“属性”窗口中单击自定义的**“文件名”**属性时,该编辑器将显示一个“打开文件”对话框。
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>
编译代码
在三个单独的程序集内编译上面的代码示例。
编译自定义控件
在 Visual Studio 中,使用 C# 创建一个名为 CustomControlLibrary 的新 WPF 用户控件库项目。
将出现的所有“UserControl1”更改为“DemoControl”。
用上面列出的代码替换 DemoControl 类中现有的代码。
生成解决方案。
编译自定义对话框属性值编辑器
在 Visual Studio 中,向解决方案中添加一个名为 CustomControlLibrary.Design 的新 WPF 用户控件库项目。
将项目的输出路径设置为“.. \CustomControlLibrary\bin\Debug\”。
从项目中删除 UserControl1.xaml 和 UserControl1.xaml.cs。
添加对下列程序集的引用。
Microsoft.Windows.Design.Extensibility
Microsoft.Windows.Design.Interaction
添加对 CustomControlLibrary 项目的引用。
向项目添加名为 EditorResources 的资源字典。
将 EditorResources.xaml 中的现有 XAML 替换为前面列出的 XAML。
将名为 EditorResources 的新类添加到项目。
用上面列出的代码替换 EditorResources 中现有的代码。
向项目中添加一个名为 FileBrowserDialogPropertyValueEditor 的新类。
用上面列出的代码替换 FileBrowserDialogPropertyValueEditor 类中现有的代码。
将名为 Metadata 的新类添加到项目。
用上面列出的代码替换 Metadata 类中现有的代码。
生成解决方案。
编译测试应用程序
在 Visual Studio 中,将新的 WPF 应用程序项目添加到解决方案。
添加对 CustomControlLibrary 程序集或项目的引用。
在 MainWindow.xaml 的 XAML 视图中,将现有 XAML 替换为前面列出的 XAML。
在 MainWindow.xaml.cs 中,注释停止对 InitializeComponent 的调用。
重新生成解决方案。
在“设计”视图中,单击 DemoControl 将其选中。 可能需要单击设计器顶部的信息栏以重新加载视图。
在“属性”窗口中,单击**“文件名”**属性旁边的按钮。
出现**“打开”**对话框。
定位到某个文件,然后单击**“打开”**。
文件名将显示在“属性”窗口的**“文件名”**属性中,FileName 属性在 XAML 视图中赋值。