DependencyObject クラス

定義

依存関係プロパティ システムに参加しているオブジェクトを表します。 DependencyObject は、 UIElementGeometryFrameworkTemplateStyleResourceDictionary など、多くの重要な UI 関連クラスの即時基本クラスです。 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 クラスを使用すると、多くの派生クラスで依存関係プロパティ システム サービスが有効になります。 依存関係プロパティの概念の詳細については、「 依存関係プロパティの概要」を参照してください。

依存関係プロパティ システムの主な関数は、プロパティの値を計算し、変更された値に関するシステム通知を提供することです。 依存関係プロパティ システムに参加するもう 1 つのキー クラスは 、DependencyProperty ですDependencyProperty を使用すると、依存関係プロパティをプロパティ システムに登録できます。一方、DependencyObject は基底クラスとして、オブジェクトが依存関係プロパティを使用および設定できるようにします。

DependencyObject が提供またはサポートする重要なサービスと特性を次に示します。

  • 既存のWindows ランタイム依存関係プロパティの依存関係プロパティ ホスティングのサポート。
  • カスタム依存関係プロパティのホスティングのサポート。 依存関係プロパティを登録するには、 Register メソッドを呼び出し、そのメソッドの戻り値を DependencyObject クラスのパブリック静的プロパティとして格納します。
  • 既存のWindows ランタイム添付プロパティの添付プロパティ ホスティングのサポート。
  • カスタム添付プロパティホスティングのサポート。 添付プロパティの使用法の依存関係プロパティを登録するには、 RegisterAttached メソッドを呼び出し、メソッドの戻り値をパブリック静的プロパティとしてクラスに格納します。
  • DependencyObject に存在する依存関係プロパティの値のユーティリティ メソッドを取得および設定します。 これらは、カスタム依存関係プロパティ "ラッパー" を定義するときに使用します。また、既存の "ラッパー" プロパティを使用する代わりに、アプリ コードから使用することもできます。
  • メタデータまたはプロパティ値 ( GetAnimationBaseValue など) を調べるための高度なシナリオ ユーティリティ。
  • すべての DependencyObject インスタンスに対して、Windows ランタイムのメイン UI スレッドへのスレッド アフィニティの適用。
  • 高度なスレッド処理シナリオの Dispatcher プロパティ。 Dispatcher 値を取得すると、CoreDispatcher オブジェクトへの参照が提供されます。 CoreDispatcher を使用すると、ワーカー スレッドは DependencyObject を使用するコードを実行できますが、UI スレッドには存在しません。これは、CoreDispatcher が UI スレッドをブロックしたり、UI スレッドに干渉したりしない非同期操作に実行を延期できるためです。 以下の「DependencyObject and threading」セクションを参照してください。
  • 基本的なデータ バインディングとスタイル設定のサポート。オブジェクトの有効期間の後の時点でプロパティを式として設定して評価できるようにします。 これらの概念の詳細については、「 依存関係プロパティの概要」を参照してください。 詳細については、「 データ バインディング」も参照してください。

DependencyObject とスレッド

すべての DependencyObject インスタンスは、アプリの現在の ウィンドウ に関連付けられている UI スレッドに作成する必要があります。 これはシステムによって適用され、コードに次の 2 つの重要な影響があります。

  • 2 つの DependencyObject インスタンスの API を使用するコードは、常に同じスレッド (常に UI スレッド) で実行されます。 通常、このシナリオではスレッドの問題は発生しません。
  • メイン UI スレッドで実行されていないコードは、DependencyObject に直接アクセスできません。DependencyObject には UI スレッドに対してのみスレッド アフィニティがあるためです。 UI スレッドで実行されるコードのみが、依存関係プロパティの値を変更または読み取ることができます。 たとえば、.NET タスク または明示的な ThreadPool スレッドを使用して開始したワーカー スレッドでは、依存関係プロパティを読み取ったり、他の API を呼び出したりすることはできません。

ワーカー スレッドからの DependencyObject の使用が完全にブロックされることはありません。 ただし、アプリ UI スレッドとシステムで実行されている他のスレッドとの間の意図的な分離を行うには、DependencyObject から CoreDispatcher オブジェクト ( DependencyObject.Dispatcher の値) を取得する必要があります。 CoreDispatcherRunAsync メソッドを公開します。 RunAsync を呼び出して、待機可能なコード (IAsyncAction) を実行します。 単純なコードの場合は、ラムダ式を使用できます。それ以外の場合は、デリゲート (DispatchedHandler) として実装できます。 コードを実行できる時刻がシステムによって決定されます。 スレッド間でのアクセスを有効にしているため、 DependencyObject.Dispatcher は DependencyObject またはそのサブクラスの唯一のインスタンス API であり、スレッド間例外をスローせずに UI 以外のスレッドからアクセスできます。 ワーカー スレッドまたはその他の UI 以外のスレッドから呼び出そうとすると、他のすべての DependencyObject API によって例外がスローされます。

スレッドの問題は、通常、一般的な UI コードで回避できます。 ただし、通常、デバイスは UI スレッドに関連付けられません。 デバイスから取得した情報を使用して UI をリアルタイムで更新する場合は、多くの場合、UI を更新できるように CoreDispatcher を取得する必要があります。 サービスは、サービスへのアクセスに使用するコードが UI スレッドで実行されていない可能性があるもう 1 つのケースです。

独自の DependencyObject 型を定義していて、それらをデータ ソースに使用しようとした場合や、DependencyObject が必ずしも適切ではない (オブジェクトが UI に直接関連していないため) 場合に、DependencyObject 関連のスレッド処理の問題が発生する可能性がある 1 つのコード シナリオ。 たとえば、プレゼンテーションの前に、またはデバイス、サービス、またはその他の外部入力に応答して、オブジェクトの値を変更しているバックグラウンド スレッドやその他のワーカー スレッドでパフォーマンスの最適化を試みる場合があります。 実際にシナリオに依存関係プロパティが必要かどうかを評価します。標準的なプロパティが適切である可能性があります。

DependencyObject 派生クラス

DependencyObject は、アプリとその XAML UI に使用するプログラミング モデルの基礎となる、すぐに派生した複数のクラスの親クラスです。 注目すべき派生クラスの一部を次に示します。

コンストラクター

DependencyObject()

DependencyObject 派生クラスの基底クラス初期化動作を提供します。

プロパティ

Dispatcher

このオブジェクトが関連付けられている CoreDispatcher を取得します。 CoreDispatcher は、コードが UI 以外のスレッドによって開始された場合でも、UI スレッド上の DependencyObject にアクセスできる機能を表します。

メソッド

ClearValue(DependencyProperty)

依存関係プロパティのローカル値をクリアします。

GetAnimationBaseValue(DependencyProperty)

依存関係プロパティに対して確立された基本値を返します。これは、アニメーションがアクティブでない場合に適用されます。

GetValue(DependencyProperty)

DependencyObject から依存関係プロパティの現在の有効な値を返します。

ReadLocalValue(DependencyProperty)

ローカル値が設定されている場合は、依存関係プロパティのローカル値を返します。

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

この DependencyObject インスタンスの特定の DependencyProperty に対する変更をリッスンするための通知関数を登録します。

SetValue(DependencyProperty, Object)

DependencyObject の依存関係プロパティのローカル値を設定します。

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

RegisterPropertyChangedCallback を呼び出して以前に登録した変更通知を取り消します。

適用対象

こちらもご覧ください