共用方式為


DesignModeValueProvider 類別

擷取使用者在設計工具中所做的屬性變更,並於設計階段提供新的值。

繼承階層架構

System.Object
  Microsoft.Windows.Design.Features.FeatureProvider
    Microsoft.Windows.Design.Model.DesignModeValueProvider

命名空間:  Microsoft.Windows.Design.Model
組件:  Microsoft.Windows.Design.Interaction (在 Microsoft.Windows.Design.Interaction.dll 中)

語法

'宣告
Public Class DesignModeValueProvider _
    Inherits FeatureProvider
public class DesignModeValueProvider : FeatureProvider
public ref class DesignModeValueProvider : public FeatureProvider
type DesignModeValueProvider =  
    class
        inherit FeatureProvider
    end
public class DesignModeValueProvider extends FeatureProvider

DesignModeValueProvider 型別會公開下列成員。

建構函式

  名稱 說明
公用方法 DesignModeValueProvider 初始化 DesignModeValueProvider 類別的新執行個體。

回頁首

屬性

  名稱 說明
公用屬性 Properties 取得要擷取的一組屬性。

回頁首

方法

  名稱 說明
公用方法 Equals 判斷指定的 Object 和目前的 Object 是否相等。 (繼承自 Object)。
受保護的方法 Finalize 允許物件在記憶體回收進行回收之前,嘗試釋放資源並執行其他清除作業。 (繼承自 Object)。
公用方法 GetHashCode 做為特定型別的雜湊函式。 (繼承自 Object)。
公用方法 GetType 取得目前執行個體的 Type。 (繼承自 Object)。
受保護的方法 InvalidateProperty 讓指定的屬性失效。
受保護的方法 MemberwiseClone 建立目前 Object 的淺層複本 (Shallow Copy)。 (繼承自 Object)。
公用方法 ToString 傳回表示目前物件的字串。 (繼承自 Object)。
公用方法 TranslatePropertyValue 擷取使用者在設計工具中所做的屬性變更,並使用自訂邏輯於設計階段提供新的值。

回頁首

備註

當使用者在設計工具中變更物件的屬性值時,通常會在設計工具中的物件上設定此值。 您可以使用 DesignModeValueProvider 類別,在這個處理序中插入自己的邏輯。 例如,您可能希望使用者能夠為控制項將可見的屬性設為 false,但是此控制項在設計階段仍應保持可見狀態。

若要完成這個工作,可以建立 DesignModeValueProvider 並附加至您的自訂控制項。 DesignModeValueProvider 會擷取使用者所做的屬性變更,您可以在 TranslatePropertyValue 方法中插入自己的邏輯,而 DesignModeValueProvider 會將新的值傳遞至設計工具。

重要事項重要事項

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

當您使用 DesignModeValueProvider 類別在設計階段變更屬性値時,會套用下列限制。

  • 您只能在從 DependencyObject 類別衍生的型別上設定設計階段值提供者。

  • 您只能在相依性屬性設定設計階段値提供者。

  • DesignModeValueProvider 實作必須在基底型別屬性上設定設計階段值。 您可以實作您的值提供者,以特定的衍生型別為目標。 例如,若要註冊 Button類別之 Height 屬性的値提供者,您必須在 FrameworkElement 類別註冊該提供者,並且在値提供者實作中測試目標型別。 如需詳細資訊,請參閱逐步解說:在設計階段變更屬性行為

  • 值提供者會依註冊的順序執行。 最近註冊屬性的最新値提供者會最後執行,不過,所有値提供者都會執行。

  • 如果值提供者的 TranslatePropertyValue 實作傳回 nullNull 參照 (即 Visual Basic 中的 Nothing),屬性的設計階段值設為 nullNull 參照 (即 Visual Basic 中的 Nothing)。

  • 如果值提供者的 TranslatePropertyValue 實作會傳回靜態值,UnsetValue, WPF 設計工具 會在屬性呼叫 ClearValue 方法。

注意事項注意事項

如果您要撰寫 Silverlight 控制項的值提供者,您必須使用 UnsetValue 版本的 WPF。 這是 WPF 設計工具 架構的限制。

  • 值提供者不適用於 WPF 繼承屬性。 例如,註冊 FlowDirection 的提供者在設計模式中無法如預期般運作。

  • 如果屬性值由繫結設定,值提供者必須傳回 Binding,而非計算的值。

  • 由於設計工具可能需要強制屬性使用特定的設計階段值,以確保特定的設計經驗,因此某些値提供者可能不會生效。 例如, 字型屬性的自訂值提供者無法如 WPF 設計工具 中的預期運作。

  • 當您藉由使用 TypeIdentifier註冊值提供者時,傳遞至 TranslatePropertyValue 實作的型別識別項可能與在執行階段中繼資料中指定的識別項不同。 它是相等的,但可能不會是同一個執行個體。 如果值提供者執行型別檢查,您必須解析屬性識別項的型別元件,並且在解析型別執行型別相等測試。 通常您只需檢查屬性的名稱,但如果您必須在型別執行邏輯,就需要解析型別識別項。 使用 ResolveType 方法取得正確的型別。

  • WPF 設計工具 架構可以以數種支援的格式傳遞型別識別項。 如果您的值提供者執行型別比較,您必須將型別識別項解析成實際的型別。 使用 ResolveType 方法取得正確的型別。

範例

下列範例會建立自訂 DesignModeValueProvider,此項會附加至自訂按鈕控制項。 在 TranslatePropertyValue 方法中,您會變更 ButtonContent 屬性,以在設計工具中顯示為大寫。 您也可以變更 ButtonBackground 屬性,如此一來,它就會在設計工具中以預設系統色彩顯示。 這些變更只會對設計工具造成影響。 在執行階段,內含使用者所設定之值的 ContentBackground 屬性都會顯示。

如需詳細資訊,請參閱逐步解說:在設計階段變更屬性行為



Imports System
Imports System.Windows                  'SystemColors
Imports System.Windows.Media            'SolidColorBrush
Imports System.Windows.Controls         'Button
Imports Microsoft.Windows.Design.Model  'DesignModeValueProvider
Imports Microsoft.Windows.Design.Metadata


Namespace CustomButton

    Public Class CustomButtonDesignModeValueProvider
        Inherits DesignModeValueProvider


        Public Sub New()
            Properties.Add(GetType(Button), "Content")
            Properties.Add(GetType(Button), "Background")
        End Sub



        Public Overrides Function TranslatePropertyValue( _
            ByVal item As ModelItem, _
            ByVal identifier As PropertyIdentifier, _
            ByVal value As Object) As Object

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Content" Then

                Return value.ToString().ToUpper()
            End If

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Background" Then

                Return New SolidColorBrush(SystemColors.ControlColor)
            End If

            Return MyBase.TranslatePropertyValue(item, identifier, value)
        End Function
    End Class
End Namespace


using System;
using System.Windows;                   //SystemColors
using System.Windows.Media;             //SolidColorBrush
using System.Windows.Controls;          //Button
using Microsoft.Windows.Design.Model;
using Microsoft.Windows.Design.Metadata;   //DesignModeValueProvider
namespace CustomButton
{
    class CustomButtonDesignModeValueProvider : DesignModeValueProvider
    {

        public CustomButtonDesignModeValueProvider()
        {
            Properties.Add( typeof(Button), "Content");
            Properties.Add(typeof(Button), "Background");
        }


        public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value)
        {
            if (identifier.DeclaringType == typeof( Button ) &&
                identifier.Name == "Content" )
            {
                return ((string)value).ToUpper();
            }

            if (identifier.DeclaringType == typeof(Button) &&
                identifier.Name == "Background")
            {
                return new SolidColorBrush(SystemColors.ControlColor);
            }

            return base.TranslatePropertyValue(item, identifier, value);
        }
    }
}

執行緒安全

這個型別的任何 Public static (在 Visual Basic 中為 Shared) 成員都具備執行緒安全。並非所有的執行個體成員都是安全執行緒。

請參閱

參考

Microsoft.Windows.Design.Model 命名空間

其他資源

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

WPF 設計工具擴充性架構

屬性編輯架構

功能提供者和功能連接器