如何:在设计时更改属性的行为

[本文档仅供预览,在以后的发行版中可能会发生更改。包含的空白主题用作占位符。]

当您使用扩展性自定义 适用于 Visual Studio 的 WPF 设计器时,通常会创建自定义控件。 有时您需要控件的某一属性在设计时的行为与运行时不同,但仍允许用户正常设置该属性的值。 例如,您希望用户能够将控件的可见属性设置为 false,但该控件仍应在设计时可见。

本主题描述更改自定义控件属性的设计时行为的过程。 有关指导您逐步完成这些过程的更为详细的示例,请参见演练:在设计时更改属性的行为

重要

使用此技术时,设计器中的属性行为与 XAML 视图中的属性值不匹配。XAML 视图显示用户在设计时输入的值。XAML 视图中的值表示该属性将在运行时展现的行为。

如果您只希望确定控件是否在设计时中并相应地设置其属性,请参见如何:确定自定义控件处于设计时还是运行时

创建自定义 DesignModeValueProvider

在此过程中,您将创建一个自定义 DesignModeValueProvider 类。 在 TranslatePropertyValue 方法中,为要更改的属性的新行为添加自定义逻辑。 这些更改只影响设计器。 在运行时,这些属性将按照用户设置的方式运行。

创建自定义 DesignModeValueProvider

  1. 在项目中添加对以下程序集的引用:

    • Microsoft.Windows.Design.Extensibility
  2. 向自定义控件项目添加新类,并将该类编辑为从 DesignModeValueProvider 继承。 其外观应类似于:

    
    Public Class YourCustomDesignModeValueProvider
        Inherits Microsoft.Windows.Design.Model.DesignModeValueProvider
    
    End Class
    
    
    class YourCustomDesignModeValueProvider : Microsoft.Windows.Design.Model.DesignModeValueProvider
    {
    }
    
  3. 向该类添加构造函数。 在该构造函数中标识要捕获的属性。

    
    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.
    }
    
  4. 重写类中的 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 附加到自定义控件

  1. 定位到自定义控件的类声明。 其外观应类似于:

    
    Public Class YourCustomControl
    
    
    class YourCustomControl
    
  2. 向类声明中添加 FeatureAttribute 特性,并指定在上一过程中创建的 DesignModeValueProvider

    <Microsoft.Windows.Design.Features.Feature(GetType(YourCustomDesignModeValueProvider))> _
    Public Class YourCustomControl
    
    [Microsoft.Windows.Design.Features.Feature(typeof(YourCustomDesignModeValueProvider))]
    class YourCustomControl
    

    备注

    您还可以通过提供特性表来将 DesignModeValueProvider 附加到自定义控件。有关更多信息,请参见提供设计时元数据

请参见

其他资源

设计时与运行时行为

了解 WPF 设计器扩展性

WPF 设计器扩展性