如何:在设计时更改属性的行为
[本文档仅供预览,在以后的发行版中可能会发生更改。包含的空白主题用作占位符。]
当您使用扩展性自定义 适用于 Visual Studio 的 WPF 设计器时,通常会创建自定义控件。 有时您需要控件的某一属性在设计时的行为与运行时不同,但仍允许用户正常设置该属性的值。 例如,您希望用户能够将控件的可见属性设置为 false,但该控件仍应在设计时可见。
本主题描述更改自定义控件属性的设计时行为的过程。 有关指导您逐步完成这些过程的更为详细的示例,请参见演练:在设计时更改属性的行为。
重要
使用此技术时,设计器中的属性行为与 XAML 视图中的属性值不匹配。XAML 视图显示用户在设计时输入的值。XAML 视图中的值表示该属性将在运行时展现的行为。
如果您只希望确定控件是否在设计时中并相应地设置其属性,请参见如何:确定自定义控件处于设计时还是运行时。
创建自定义 DesignModeValueProvider
在此过程中,您将创建一个自定义 DesignModeValueProvider 类。 在 TranslatePropertyValue 方法中,为要更改的属性的新行为添加自定义逻辑。 这些更改只影响设计器。 在运行时,这些属性将按照用户设置的方式运行。
创建自定义 DesignModeValueProvider
在项目中添加对以下程序集的引用:
- Microsoft.Windows.Design.Extensibility
向自定义控件项目添加新类,并将该类编辑为从 DesignModeValueProvider 继承。 其外观应类似于:
Public Class YourCustomDesignModeValueProvider Inherits Microsoft.Windows.Design.Model.DesignModeValueProvider End Class
class YourCustomDesignModeValueProvider : Microsoft.Windows.Design.Model.DesignModeValueProvider { }
向该类添加构造函数。 在该构造函数中标识要捕获的属性。
Public Sub New() 'Properties.Add(<The Property To Change Goes Here>) 'More properties can go here. End Sub
public YourCustomDesignModeValueProvider() { //Properties.Add(<The Property To Change Goes Here>); //More properties can go here. }
重写类中的 TranslatePropertyValue 方法。 这是指定属性在运行时的新行为的位置。
Public Overrides Function TranslatePropertyValue( _ ByVal item As ModelItem, _ ByVal identifier As PropertyIdentifier, _ ByVal value As Object) As Object 'If identifier.Name = <Name of the property to change> Then ' ' Custom logic goes here. 'End If 'More custom logic for more properties can go here. Return MyBase.TranslatePropertyValue(item, identifier, value) End Function
public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value) { //if (identifier.Name == <Name of the property to change>) //{ // Custom logic goes here. //} //More custom logic for more properties can go here. return base.TranslatePropertyValue(item, identifier, value); }
备注
在此过程中,您将创建一个处理两个不同属性的 DesignModeValueProvider。您也可以创建多个 DesignModeValueProvider 对象来处理不同的属性。
将 DesignModeValueProvider 附加到自定义控件
在此过程中,您通过使用 FeatureAttribute 特性来将 DesignModeValueProvider 附加到自定义控件。
将 DesignModeValueProvider 附加到自定义控件
定位到自定义控件的类声明。 其外观应类似于:
Public Class YourCustomControl
class YourCustomControl
向类声明中添加 FeatureAttribute 特性,并指定在上一过程中创建的 DesignModeValueProvider。
<Microsoft.Windows.Design.Features.Feature(GetType(YourCustomDesignModeValueProvider))> _ Public Class YourCustomControl
[Microsoft.Windows.Design.Features.Feature(typeof(YourCustomDesignModeValueProvider))] class YourCustomControl
备注
您还可以通过提供特性表来将 DesignModeValueProvider 附加到自定义控件。有关更多信息,请参见提供设计时元数据。