Language

DependencyObject クラス

定義

依存関係プロパティ システムに参加するオブジェクトを表します。 DependencyObject は、 UIElement、 Geometry、 FrameworkTemplate、 Style、 ResourceDictionary など、多くの重要な 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 スレッドをブロックしないか、それ以外の場合は干渉しない非同期操作に実行を延期できるためです。 後述の「DependencyObject とスレッド」セクションを参照してください。
  • オブジェクトの有効期間内のある時点で、プロパティを式として設定して評価できるようにすることで、基本的なデータ バインディングとスタイルのサポート。 これらの概念については、「 依存関係プロパティの概要」で詳しく説明します。 詳細な データ バインディングも参照してください。

DependencyObject とスレッド処理

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

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

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

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

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

DependencyObject 派生クラス

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

コンストラクター

Name 説明
DependencyObject()

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

プロパティ

Name 説明
Dispatcher

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

メソッド

Name 説明
ClearValue(DependencyProperty)

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

GetAnimationBaseValue(DependencyProperty)

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

GetValue(DependencyProperty)

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

ReadLocalValue(DependencyProperty)

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

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

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

SetValue(DependencyProperty, Object)

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

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

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

適用対象

関連項目