型コンバーターおよびマークアップ拡張機能で使用できるサービス コンテキスト
型コンバーターとマークアップ拡張機能の使用をサポートする型の作成者には、マークアップまたは周辺のオブジェクト グラフ構造体のどこで使用されているかを示す文脈情報が必要です。 情報は、指定されるオブジェクトを正しくインスタンス化するため、またオブジェクト グラフ内の既存オブジェクトへのオブジェクト参照を行うために必要です。 .NET Framework XAML サービスを使用している場合、必要となる可能性のあるコンテキストは一連のサービス インターフェイスとして公開されます。 型コンバーターまたはマークアップ拡張サポート コードは、XamlObjectWriter または関連する型から渡される使用可能なサービス プロバイダー コンテキストを使用して、サービスを照会できます。 XAML スキーマ コンテキストは、このようなサービスを通じて直接使用できます。 このトピックでは、値コンバーター実装からサービス コンテキストにアクセスする方法を説明し、通常使用できるサービスとそれらのロールを一覧します。
このトピックは、次のセクションで構成されています。
- サービスの取得
- マークアップ拡張機能のサービス
- 型コンバーターのサービス
- 値シリアライザーのサービス
- XAML サービス プロバイダー コンテキストの使用
- .NET Framework XAML サービス コンテキストから使用できるサービス
- 関連トピック
サービスの取得
値コンバーターの実装者は、通常、値コンバーターが適用されるコンテキストにアクセスする必要があります。 このコンテキストには、アクティブな XAML スキーマ コンテキスト、XAML スキーマ コンテキストや XAML オブジェクト ライターが指定する型マッピング システムへのアクセスなどの情報が含まれます。 マークアップ拡張機能または型コンバーターの実装で使用されるサービスは、各仮想メソッドのシグネチャの一部であるコンテキスト パラメーターを通じて通信されます。 いずれの場合でも、コンテキストに IServiceProvider が実装されているので、IServiceProvider.GetService を呼び出してサービスを要求することができます。
マークアップ拡張機能のサービス
MarkupExtension には、1 つの仮想メソッド (ProvideValue) しかありません。 入力 serviceProvider パラメーターは、XAML プロセッサによってマークアップ拡張機能が呼び出されたときに、サービスが実装に伝えられる方法を示します。 次の疑似コードは、マークアップ拡張機能の実装が ProvideValue でサービスを照会する方法を示します。
public override object ProvideValue(IServiceProvider serviceProvider)
{
...
// Get the IXamlTypeResolver from the service provider
if (serviceProvider == null)
{
throw new ArgumentNullException("serviceProvider");
}
IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
if (xamlTypeResolver == null)
{
throw new ArgumentException("IXamlTypeResolver"));
}
...
}
型コンバーターのサービス
TypeConverter には、サービス コンテキストを使用し、XAML の使用をサポートする仮想メソッドが 4 つあります。 これらのメソッドは、それぞれ入力 context パラメーターを渡します。 このパラメーターの型は ITypeDescriptorContext ですが、そのインターフェイスは IServiceProvider を継承するため、型コンバーターの実装には GetService メソッドがあります。
次の疑似コードは、XAML の使用における型コンバーターの実装が、オーバーライド (この場合は ConvertFrom) でサービスを照会する方法を示します。
public override object ConvertFrom(ITypeDescriptorContext typeDescriptorContext,
CultureInfo cultureInfo,
object source)
{
IRootObjectProvider rootProvider = typeDescriptorContext.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
if (rootProvider != null && source is String)
{
//return something, else ...
}
throw GetConvertFromException(source);
}
値シリアライザーのサービス
値シリアライザーのコンテキストでは、ValueSerializer クラス、IValueSerializerContext 固有のサービス プロバイダー型を使用します。 このコンテキストは、ValueSerializer の 4 つの仮想メソッドのオーバーライドに渡されます。 サービスを取得するには、コンテキストから GetService を呼び出します。
XAML サービス プロバイダー コンテキストの使用
マークアップ拡張機能または型コンバーターで使用できる XAML サービスにアクセスするための GetService のサービス プロバイダーは内部クラスとして実装されており、インターフェイス、および関連コンテキストに渡される方法を通じてのみ公開されています。 読み込みパスまたは保存パスの、既定の .NET Framework XAML サービス実装にある XAML 処理操作が、サービス コンテキストを必要とする関連マークアップ拡張機能または型コンバーター メソッドを呼び出すと、この内部オブジェクトが渡されます。 状況に応じ、システムのサービス コンテキストは MarkupExtensionContext か TextSyntaxContext を使用しますが、これら両方のクラスの詳細は内部にあります。 これらのクラスとの対話は、GetService を通じてサービスを要求する場合に限定されます。
.NET Framework XAML サービス コンテキストから使用できるサービス
.NET Framework XAML サービスは、マークアップ拡張機能、型コンバーター、値シリアライザーに加え、その他の使用についてのサービスも定義します。 次のセクションでは、これらの各サービスについて説明し、実装でのサービスの使用法についてのガイダンスを示します。
IServiceProvider
リファレンス ドキュメント: IServiceProvider
関連: .NET Framework のサービス ベースのインフラストラクチャの基本操作なので、IServiceProvider.GetService を呼び出すことができます。
ITypeDescriptorContext
リファレンス ドキュメント: ITypeDescriptorContext
IServiceProvider から派生します。 このクラスは、標準的な TypeConverter シグネチャのコンテキストを表します。TypeConverter は .NET Framework Version 1.0 以降、XAML および XAML の文字列/値の型変換の TypeConverter のシナリオよりも前から存在するクラスです。 .NET Framework XAML サービス コンテキストでは、TypeConverter のメソッドは明示的に実装されています。 実装の明示的な動作により、ITypeDescriptorContext API は XAML 型システムまたは XAML からのオブジェクトの読み取りや書き込みには関連していないことが、呼び出し側に示されます。 Container、Instance、および PropertyDescriptor は、一般に、.NET Framework XAML サービス コンテキストから null を返します。
IValueSerializerContext
リファレンス ドキュメント: IValueSerializerContext
ITypeDescriptorContext から派生し、XAML 型システムに関する不正な影響を抑制するため、明示的な実装に依存します。 ValueSerializer の静的ルックアップ ヘルパー メソッドをサポートします。
IXamlTypeResolver
リファレンス ドキュメント: IXamlTypeResolver
定義元: System.Windows.Markup 名前空間、System.Xaml アセンブリ
関連: 読み込みパスのシナリオ、および XAML スキーマ コンテキストとの対話
サービス API: Resolve
XAML ライターがオブジェクト グラフで CLR オブジェクトを構築するときに必要な、XAML から CLR の型マッピングに影響する可能性があります。 Resolve は、XAML 型名 (XamlType.Name) に対応する、プレフィックス修飾された文字列を処理し、CLR Type を返します。 型の解決は、通常、XAML スキーマ コンテキストに大きく依存します。 どのアセンブリが読み込まれているか、これらのアセンブリの中で、型解決するためにアクセスできる、またはアクセスする必要があるものはどれかなど、考慮事項を認識しているのは XAML スキーマ コンテキストだけです。
IUriContext
リファレンス ドキュメント: IUriContext
定義元: System.Windows.Markup 名前空間、System.Xaml アセンブリ
関連: URI または x:Uri 値であるメンバー値の、読み込みパスおよび保存パスの処理。
サービス API: BaseUri
このサービスは、グローバルに使用できる URI ルート (ある場合) を報告します。 URI ルートを使用し、相対 URI を絶対 URI に、または絶対 URI を相対 URI として解決できます。 このシナリオは主に、特定のフレームワークによって公開されるアプリケーション サービス、またはフレームワークでよく使用されるルート要素クラスの機能に関連しています。 ベース URI は、XAML リーダー設定として確立され、その後、XAML オブジェクト ライターに渡され、このサービスによってレポートされます。
IAmbientProvider
リファレンス ドキュメント: IAmbientProvider
定義元: System.Xaml 名前空間、System.Xaml アセンブリ
関連: 読み込みパスの処理、および型ルックアップの遅延または最適化。
サービス API: GetAllAmbientValues、その他 3 つ。
XAML におけるアンビエンスの概念は、型の特定のメンバーをアンビエントとしてマーク付けする方法です。 また、型のインスタンスを保持するすべてのプロパティ値をアンビエント プロパティとして考慮する必要がある場合も、型をアンビエントにすることができます。 XAML ノード ストリームの先にあるか、オブジェクト グラフの下位にあるマークアップ拡張機能または型コンバーターは、読み込み時にアンビエント プロパティまたは型インスタンスにアクセスしたり、保存時にアンビエント構造の情報を活用したりできます。 これにより、IXamlTypeResolver や x:Type など、その他のサービスの型解決に必要な修飾の程度が左右されます。 「AmbientPropertyValue」も参照してください。
IXamlSchemaContextProvider
リファレンス ドキュメント: IXamlSchemaContextProvider
定義元: System.Xaml 名前空間、System.Xaml アセンブリ
関連: 読み込みパス、および XAML 型をバッキング型に解決する必要があるその他の操作。
サービス API: SchemaContext
遅延コンテンツを統合するには、同じスキーマ コンテキストが遅延領域に対して作用する必要があるので、遅延読み込み操作には XAML スキーマ コンテキストが必要です。 XAML スキーマ コンテキストの役割の詳細については、「XAML サービス」を参照してください。
IRootObjectProvider
リファレンス ドキュメント: IRootObjectProvider
定義元: System.Xaml 名前空間、System.Xaml アセンブリ
関連: 読み込みパス
サービス API: RootObject
このサービスは主に、特定のフレームワークによって公開されるアプリケーション サービス、またはフレームワークでよく使用されるルート要素クラスの機能に関連しています。 ルート オブジェクトを取得するシナリオとして、分離コードとイベント接続をつなげることが挙げられます。 たとえば、x:Class の WPF 実装は、マークアップ コンパイルと、XAML マークアップの他の場所にあるイベント ハンドラー属性の関連付けにおいて使用されます。 マークアップ コンパイルの部分クラスで定義されたマークアップと分離コードのコネクション ポイントは、ルート要素です。
IXamlNamespaceResolver
リファレンス ドキュメント: IXamlNamespaceResolver
定義元: System.Xaml 名前空間、System.Xaml アセンブリ
関連: 読み込みパス、保存パス。
サービス API: GetNamespace の場合は読み込みパス、GetNamespacePrefixes の場合は保存パス。
IXamlNamespaceResolver は、元の XAML マークアップで対応付けられたプレフィックスに基づく XAML 名前空間 ID/URI を返すことができるサービスです。
IProvideValueTarget
リファレンス ドキュメント: IProvideValueTarget
定義元: System.Windows.Markup 名前空間、System.Xaml アセンブリ
関連: 読み込みパスと保存パス。
サービス API: TargetObject、TargetProperty。
IProvideValueTarget を使用すると、型コンバーターまたはマークアップ拡張機能が、読み込み時に動作している場所に関するコンテキストを得ることができます。 このコンテキストは、実装で使用が無効化されるときにも使用されることがあります。 たとえば、WPF では、DynamicResourceExtension などの一部のマークアップ拡張機能内でロジックを保持しています。 ロジックは、拡張機能が依存関係プロパティ (または、その他の非依存関係プロパティの短い一覧) を設定するためにだけ使用されていることを保証するために、TargetProperty をチェックします。
IXamlNameResolver
リファレンス ドキュメント: IXamlNameResolver
定義元: System.Xaml 名前空間、System.Xaml アセンブリ
関連: 読み込みパスのオブジェクト グラフ定義、x:Name によって識別される解決オブジェクト、x:Reference、またはフレームワーク固有の技術。
サービス API: Resolve や、前方参照を処理する場合などの高度なシナリオで使用されるその他の API。
x:Reference 処理の .NET Framework XAML サービス実装は、このサービスに依存しています。 フレームワークをサポートする特定のフレームワークまたはツールは、このサービスを使用し、x:Name の処理、または同等の (RuntimeNamePropertyAttribute 属性付き) プロパティ処理を行います。
IDestinationTypeProvider
リファレンス ドキュメント: IDestinationTypeProvider
定義元: System.Xaml 名前空間、System.Xaml アセンブリ
関連: 間接 CLR 型情報の読み込みパス解決。
サービス API: GetDestinationType
詳細については、「IDestinationTypeProvider」を参照してください。