共用方式為


HOW TO:在設計階段變更屬性行為

當您使用擴充性自訂 WPF Designer for Visual Studio 時,通常會建立自訂控制項。 您有時會需要控制項的屬性在設計階段與執行階段有不同的行為,但又能正常讓使用者設定屬性的值。 例如,您可能希望使用者能夠為控制項將可見的屬性設為 false,但是此控制項在設計階段仍應保持可見狀態。

本主題將描述變更自訂控制項屬性之設計階段行為的程序。 如需逐步引導您完成程序的詳細範例,請參閱逐步解說:在設計階段變更屬性行為

重要

當您使用這項技術時,設計工具中的屬性行為和 [XAML] 檢視中的屬性值並不相符。[XAML] 檢視會顯示使用者在設計階段輸入的值。[XAML] 檢視中的值表示屬性在執行階段時顯示的行為。

如果您只要判斷控制項是否處於設計階段中,以及依此設定其屬性,請參閱 HOW TO:判斷自訂控制項是在設計階段或執行階段

建立自訂 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. 找出自訂控制項的類別宣告 (Class Declaration)。 看起來應該像這樣子:

    
    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 設計工具擴充性