DependencyObject クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
依存関係プロパティ システムに参加しているオブジェクトを表します。
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
- 継承
- 派生
- 属性
例
この例では、 から 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
、多くの派生クラスで依存関係プロパティ システム サービスを有効にし、 UIElement、 Geometry、 FrameworkTemplate、 Style、 ResourceDictionary など、多くの重要な 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 スレッドとシステムで実行されている他のスレッドとの間で意図的な分離を行う必要があります。 は DispatcherQueue
TryEnqueue メソッドを公開して、待機可能なコードを実行します。 スレッド間でのアクセスを有効にしているため、 DependencyObject.DispatcherQueue
は、スレッド間の例外をスローせずに UI 以外のスレッドからアクセスできる またはそのサブクラスの唯一のインスタンス API DependencyObject
です。 他 DependencyObject
のすべての API は、ワーカー スレッドまたはその他の UI 以外のスレッドから呼び出そうとすると、例外をスローします。
通常、スレッド処理の問題は、一般的な UI コードで回避できます。 ただし、通常、デバイスは UI スレッドに関連付けられません。 デバイスから取得した情報を使用して UI をリアルタイムで更新する場合は、多くの場合、UI を更新できるように を DispatcherQueue
取得する必要があります。 サービスは、サービスへのアクセスに使用するコードが UI スレッドで実行されていない可能性があるもう 1 つのケースです。
独自DependencyObject
の型を定義し、データ ソースに使用しようとすると、関連するスレッドの問題が発生DependencyObject
する可能性がある 1 つのコード シナリオ、または が必ずしも適切でない他のシナリオ DependencyObject
(オブジェクトが UI に直接関連していないため)。 たとえば、プレゼンテーションの前に、またはデバイス、サービス、またはその他の外部入力に応答して、オブジェクトの値を変更しているバックグラウンド スレッドまたはその他のワーカー スレッドでパフォーマンスの最適化を試みる場合があります。 実際にシナリオに依存関係プロパティが必要かどうかを評価します。標準的なプロパティが適切である可能性があります。
DependencyObject 派生クラス
DependencyObject
は、アプリとその XAML UI に使用するプログラミング モデルの基礎となる、すぐに派生した複数のクラスの親クラスです。 注目すべき派生クラスの一部を次に示します。
- UIElement: UI で入力を処理できるほとんどのビジュアル オブジェクトの基本クラス。 FrameworkElement は Control と同様にこの階層にあります。そのため、Windows ランタイムには何百ものコントロールとその他のクラスがあり、すべてのクラス階層に UIElement クラスが含まれています。
- XAML スタイル システムサポート クラス: FrameworkTemplate ( ControlTemplate、 DataTemplate、 ItemsPanelTemplate の親)、 Style、 SetterBase ( Setter の親)、 ToolTipTemplateSettings 、およびその他 の TemplateSettings。
- ビジュアル状態モデル: Transition、 VisualState、 VisualStateGroup、 VisualStateManager、 VisualTransition。
- データ バインディングのサポート: BindingBase ( Binding の親)、 CollectionViewSource、 PropertyPath、 RelativeSource。
- ストーリーボード アニメーション: タイムライン ( ストーリーボードの親、型指定されたアニメーション、テーマ アニメーション)、型指定されたキーフレーム ( ColorKeyFrame など)、 KeySpline、 EasingFunctionBase。
- XAML グラフィックスとレンダリング プリミティブ: Brush、 Geometry、 GeneralTransform、 GradientStop、 PathFigure、 PathSegment、 Projection。
- イメージングとレンダリングサーフェス相互運用機能: ImageSource ( BitmapSource、 RenderTargetBitmap、 SurfaceImageSource などの親)。
- ウィンドウ: メイン アプリ ウィンドウを表します。
- FlyoutBase ( ポップアップ と MenuFlyout の親)。
- ResourceDictionary: XAML でキー付きリソースを定義します。
- TextElement: Block と Inline の親。これらは、 TextBlock コンテンツまたはリッチ テキスト要素に使用されるテキスト要素の基本クラスです。
- AutomationPeer: Microsoft UI オートメーション リスナーへの XAML コントロールを表す Microsoft UI オートメーション ピアの基本クラス。 また、 IRawElementProviderSimple。
- その他: CacheMode、 ColumnDefinition、 DependencyObjectCollection、 InputScope、 InputScopeName、 PageStackEntry、 PrintDocument、 RowDefinition、 TriggerAction、 TriggerBase。
コンストラクター
DependencyObject() |
DependencyObject 派生クラスの基底クラス初期化動作を提供します。 |
プロパティ
Dispatcher |
常に Windows アプリ SDK アプリで を返します |
DispatcherQueue |
このオブジェクトが |
メソッド
ClearValue(DependencyProperty) |
依存関係プロパティのローカル値をクリアします。 |
GetAnimationBaseValue(DependencyProperty) |
依存関係プロパティに対して確立された基本値を返します。これは、アニメーションがアクティブでない場合に適用されます。 |
GetValue(DependencyProperty) |
DependencyObject から依存関係プロパティの現在の有効な値を返します。 |
ReadLocalValue(DependencyProperty) |
ローカル値が設定されている場合は、依存関係プロパティのローカル値を返します。 |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
この DependencyObject インスタンスの特定の DependencyProperty に対する変更をリッスンするための通知関数を登録します。 |
SetValue(DependencyProperty, Object) |
DependencyObject の依存関係プロパティのローカル値を設定します。 |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
RegisterPropertyChangedCallback を呼び出して以前に登録した変更通知を取り消します。 |