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;
    }
}

この例では、単純な依存関係プロパティの宣言を示します。 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); }
    }
}

注釈

クラスは DependencyObject 、多くの派生クラスで依存関係プロパティ システム サービスを有効にし、 UIElementGeometryFrameworkTemplateStyleResourceDictionary など、多くの重要な UI 関連クラスの即時基底クラスです。 依存関係プロパティのサポート方法 DependencyObject の詳細については、「 依存関係プロパティの概要」を参照してください。

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

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

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

DependencyObject とスレッド

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

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

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

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

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

DependencyObject 派生クラス

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

コンストラクター

DependencyObject()

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

プロパティ

Dispatcher

常に Windows アプリ SDK アプリで を返しますnull。 代わりに DispatcherQueue を使用してください。

DispatcherQueue

このオブジェクトが DispatcherQueue 関連付けられている を取得します。 は DispatcherQueue 、コードが 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 を呼び出して以前に登録した変更通知を取り消します。

適用対象

こちらもご覧ください