DependencyObject 類別

定義

代表參與相依性屬性系統的物件。 DependencyObject 是許多重要 UI 相關類別的立即基類,例如 UIElementGeometryFrameworkTemplateStyleResourceDictionary。 如需 DependencyObject 如何支援相依性屬性的詳細資訊,請參閱 相依性屬性概觀

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DependencyObject
Public Class DependencyObject
繼承
Object Platform::Object IInspectable DependencyObject
衍生
屬性

Windows 需求

裝置系列
Windows 10 (已於 10.0.10240.0 引進)
API contract
Windows.Foundation.UniversalApiContract (已於 v1.0 引進)

範例

這個範例會定義衍生自 DependencyObject 的類別,並定義附加屬性以及識別碼欄位。 此類別的案例是,它是一個服務類別,宣告附加屬性,其他 UI 元素可以在 XAML 中設定。服務可能會在執行時間對這些 UI 元素的附加屬性值採取動作。

public abstract class AquariumServices : DependencyObject
{
    public enum Buoyancy {Floats,Sinks,Drifts}

    public static readonly DependencyProperty BuoyancyProperty = DependencyProperty.RegisterAttached(
      "Buoyancy",
      typeof(Buoyancy),
      typeof(AquariumServices),
      new PropertyMetadata(Buoyancy.Floats)
    );
    public static void SetBuoyancy(DependencyObject element, Buoyancy value)
    {
        element.SetValue(BuoyancyProperty, value);
    }
    public static Buoyancy GetBuoyancy(DependencyObject element)
    {
        return (Buoyancy)element.GetValue(BuoyancyProperty);
    }
}
Public Class AquariumServices
    Inherits DependencyObject
    Public Enum Buoyancy
        Floats
        Sinks
        Drifts
    End Enum

    Public Shared ReadOnly BuoyancyProperty As DependencyProperty = _
          DependencyProperty.RegisterAttached(
          "Buoyancy", _
          GetType(Buoyancy), _
          GetType(AquariumServices), _
          New PropertyMetadata(Buoyancy.Floats))


    Public Sub SetBuoyancy(element As DependencyObject, value As Buoyancy)
        element.SetValue(BuoyancyProperty, value)
    End Sub
    Public Function GetBuoyancy(element As DependencyObject) As Buoyancy
        GetBuoyancy = CType(element.GetValue(BuoyancyProperty), Buoyancy)
    End Function
End Class
public static bool ClearSetProperty(DependencyObject targetObject, DependencyProperty targetDP)
{
    if (targetObject == null || targetDP == null)
    {
        throw new ArgumentNullException();
    }
    object localValue = targetObject.ReadLocalValue(targetDP);
    if (localValue == DependencyProperty.UnsetValue)
    {
        return false;
    }
    else
    {
        targetObject.ClearValue(targetDP);
        return true;
    }
}
Public Shared Function ClearSetProperty(targetObject As DependencyObject, targetDP As DependencyProperty) As Boolean
    If targetObject Is Nothing Or targetDP Is Nothing Then
        Throw New ArgumentNullException()
    End If
    Dim localValue As Object = targetObject.ReadLocalValue(targetDP)
    If localValue = DependencyProperty.UnsetValue Then
        ClearSetProperty = False
    Else
        targetObject.ClearValue(targetDP)
        ClearSetProperty = True
    End If
End Function

此範例示範簡單的相依性屬性宣告。 對 GetValue的呼叫會構成新相依性屬性之屬性包裝函式的完整get存取子實作。 對 SetValue的呼叫會構成整個 set存取子實作。 如需更多範例,請參閱 自訂相依性屬性

public class Fish : Control
{
    public static readonly DependencyProperty SpeciesProperty =
    DependencyProperty.Register(
    "Species",
    typeof(String),
    typeof(Fish), null
    );
    public string Species
    {
        get { return (string)GetValue(SpeciesProperty); }
        set { SetValue(SpeciesProperty, (string)value); }
    }
}
Public Class Fish
    Inherits Control

    Public Shared ReadOnly SpeciesProperty As DependencyProperty = _
    DependencyProperty.Register(
    "Species", _
    GetType(String), _
    GetType(Fish), _
    Nothing)
    Public Property Species As String
        Get
            Species = CType(GetValue(SpeciesProperty), String)
        End Get
        Set(value As String)
            SetValue(SpeciesProperty, value)
        End Set
    End Property
End Class

備註

DependencyObject 類別會在其許多衍生類別上啟用相依性屬性系統服務。 如需相依性屬性概念的詳細資訊,請參閱 相依性屬性概觀

相依性屬性系統的主要函式是計算屬性值,並提供已變更之值的系統通知。 參與相依性屬性系統的另一個主要類別是 DependencyPropertyDependencyProperty 可讓相依性屬性註冊至屬性系統,而 DependencyObject 做為基類可讓物件使用和設定相依性屬性。

以下是 DependencyObject 提供或支援的一些值得注意的服務與特性:

  • 現有相依性屬性的相依性屬性裝載支援Windows 執行階段相依性屬性。
  • 自訂相依性屬性裝載支援。 您可以呼叫 Register 方法,並將方法的傳回值儲存為 DependencyObject 類別中的公用靜態屬性,以註冊相依性屬性。
  • 附加屬性裝載對現有Windows 執行階段附加屬性的支援。
  • 自訂附加屬性裝載支援。 您可以呼叫 RegisterAttached 方法,並將方法的傳回值儲存為類別中的公用靜態屬性,以註冊附加屬性使用方式的相依性屬性。
  • 取得設定 存在於 DependencyObject 上之任何相依性屬性值的公用程式方法。 當您定義自訂相依性屬性 「包裝函式」時,也可以使用它們從應用程式程式碼使用這些屬性,作為使用現有「包裝函式」屬性的替代方案。
  • 用於檢查中繼資料或屬性值 (的進階案例公用程式,例如 GetAnimationBaseValue) 。
  • 針對所有 DependencyObject 實例,對Windows 執行階段的主要 UI 執行緒強制執行執行緒親和性。
  • 進階執行緒案例的 Dispatcher 屬性。 取得 Dispatcher 值會提供 CoreDispatcher 物件的參考。 使用 CoreDispatcher時,背景工作執行緒可以執行使用 DependencyObject 但不在 UI 執行緒上的程式碼,因為 CoreDispatcher 可以將執行延遲到不會封鎖或干擾 UI 執行緒的非同步作業。 See "DependencyObject and threading" section below.
  • 基本資料系結和樣式支援,方法是讓屬性設定為運算式,以便在物件存留期稍後的某個時間點進行評估。 相 依性屬性概觀中會更詳細地說明這些概念。 另請參閱 深入的資料系結

DependencyObject 和執行緒

所有 DependencyObject 實例都必須建立在與應用程式目前 視窗 相關聯的 UI 執行緒上。 這是由系統強制執行,這對您的程式碼有兩個重要影響:

  • 從兩個 DependencyObject 實例使用 API 的程式碼一律會在相同的執行緒上執行,也就是一律是 UI 執行緒。 在此案例中,您通常不會遇到執行緒問題。
  • 主要 UI 執行緒上未執行的程式碼無法直接存取 DependencyObject,因為 DependencyObject 只有 UI 執行緒的執行緒親和性。 只有在 UI 執行緒上執行的程式碼可以變更或甚至讀取相依性屬性的值。 例如,您使用 .NET 工作 或明確 ThreadPool 執行緒起始的背景工作執行緒將無法讀取相依性屬性或呼叫其他 API。

您不會完全禁止使用背景工作執行緒的 DependencyObject。 但您必須從 DependencyObject 取得 CoreDispatcher 物件 (DependencyObject.Dispatcher 的值) ,才能在應用程式 UI 執行緒與系統上執行的任何其他執行緒之間刻意分隔。 CoreDispatcher會公開RunAsync方法。 呼叫 RunAsync 以在 IAsyncAction) (執行可等候的程式碼。 如果是簡單的程式碼,您可以使用 Lambda 運算式,否則您可以實作為委派 (DispatchedHandler) 。 系統會決定程式碼可以執行的時間。 由於它啟用跨執行緒的存取, DependencyObject.Dispatcher 是唯一的 DependencyObject 實例 API 或其任何可從非 UI 執行緒存取的子類別,而不會擲回跨執行緒例外狀況。 如果您嘗試從背景工作執行緒或任何其他非 UI 執行緒呼叫它們,所有其他 DependencyObject API 會擲回例外狀況。

在一般 UI 程式碼中,通常可以避免執行緒問題。 不過,裝置通常不會與 UI 執行緒相關聯。 如果您使用從裝置取得的資訊即時更新 UI,您通常必須取得 CoreDispatcher ,才能更新 UI。 服務是您用來存取服務的程式碼可能不會在 UI 執行緒上執行的另一種情況。

如果您定義自己的 DependencyObject 類型,而且您嘗試將它們用於資料來源,或是 DependencyObject 不一定適當地 (,因為物件與) UI 不直接相關,所以可能會遇到與 DependencyObject 相關的執行緒問題之一個程式碼案例。 例如,您可能嘗試使用背景執行緒或其他背景執行緒或其他背景工作執行緒進行效能優化,這些執行緒會在呈現之前變更物件的值,或回應裝置、服務或其他外部輸入。 評估您是否真的需要案例的相依性屬性;或許標準屬性已足夠。

DependencyObject 衍生類別

DependencyObject 是數個立即衍生類別的父類別,這些類別都是您用於應用程式及其 XAML UI 之程式設計模型的基礎。 以下是一些值得注意的衍生類別:

建構函式

DependencyObject()

提供 DependencyObject 衍生類別的基類初始化行為。

屬性

Dispatcher

取得這個 物件相關聯的 CoreDispatcherCoreDispatcher代表可在 UI 執行緒上存取DependencyObject的功能,即使程式碼是由非 UI 執行緒起始也一樣。

方法

ClearValue(DependencyProperty)

清除相依性屬性的本機值。

GetAnimationBaseValue(DependencyProperty)

傳回為相依性屬性建立的任何基底值,如果動畫未使用中,則適用此屬性。

GetValue(DependencyProperty)

DependencyObject傳回相依性屬性的目前有效值。

ReadLocalValue(DependencyProperty)

如果已設定本機值,則傳回相依性屬性的本機值。

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

註冊通知函式,以接聽此DependencyObject實例上特定DependencyProperty的變更。

SetValue(DependencyProperty, Object)

設定 DependencyObject上相依性屬性的本機值。

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

取消先前透過呼叫 RegisterPropertyChangedCallback註冊的變更通知。

適用於

另請參閱