Share via


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

更新:2007 年 11 月

当您使用扩展性自定义 Visual Studio Windows Presentation Foundation (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 identifier As Microsoft.Windows.Design.Model.PropertyIdentifier, ByVal value As Object) As Object
    
        'If identifier.DependencyProperty Is <Property To Change> Then
        '
        '    Custom logic goes here.
        'End If
    
        'More custom logic for more properties can go here.
    
        Return MyBase.TranslatePropertyValue(identifier, value)
    End Function
    
    public override object TranslatePropertyValue(Microsoft.Windows.Design.Model.PropertyIdentifier identifier, object value)
    {
        //if (identifier.DependencyProperty == <The Property To Change>)
        //{
        //    Custom logic goes here.
        //}
    
        //More custom logic for more properties can go here.
    
        return base.TranslatePropertyValue(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 设计器扩展性