DependencyObject 類別

定義

代表參與相依性屬性系統的物件。

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 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(Microsoft.UI.Xaml.WinUIContract), 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
衍生
屬性

範例

這個範例會定義衍生自 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 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;
    }
}

此範例示範簡單的相依性屬性宣告。 對 GetValueget呼叫會構成新相依性屬性之屬性包裝函式的整個存取子實作。 對 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); }
    }
}

備註

類別 DependencyObject 會在其許多衍生類別上啟用相依性屬性系統服務,而且是許多重要UI相關類別的立即基類,例如 UIElementGeometryFrameworkTemplateStyleResourceDictionary。 如需如何 DependencyObject 支援相依性屬性的詳細資訊,請參閱 相依性屬性概觀

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

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

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

DependencyObject 和線程處理

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

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

您不會完全封鎖從背景工作線程使用 DependencyObject 。 但是您必須取得 DispatcherQueue 物件, (DependencyObject.DispatcherQueue 的值) , DependencyObject 才能在應用程式 UI 線程與系統上執行的任何其他線程之間刻意分隔。 會 DispatcherQueue 公開 TryEnqueue 方法來執行可等候的程式代碼。 由於它啟用跨線程的存取, DependencyObject.DispatcherQueue 因此 是唯一可從非UI線程存取的 DependencyObject 實例 API 或其任何子類別,而不會擲回跨線程例外狀況。 如果您嘗試從背景工作線程或任何其他非UI線程呼叫它們,所有其他 DependencyObject API 都會擲回例外狀況。

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

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

DependencyObject 衍生類別

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

建構函式

DependencyObject()

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

屬性

Dispatcher

一律會在 Windows 應用程式 SDK 應用程式中傳回null。 請改用 DispatcherQueue

DispatcherQueue

DispatcherQueue取得與這個 物件相關聯的 。 DispatcherQueue表示即使程式代碼是由非 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 註冊的變更通知。

適用於

另請參閱