x:Shared 属性
false
に設定すると、WPF リソース取得の動作が変更され、すべての要求で同じインスタンスが共有されるのではなく、属性付きリソースの要求によって要求ごとに新しいインスタンスが作成されるようになります。
XAML 属性の使用方法
<ResourceDictionary>
<object x:Shared="false".../>
</ResourceDictionary>
解説
x:Shared
は XAML 言語の XAML 名前空間にマップされ、.NET XAML サービスとその XAML リーダーによって有効な XAML 言語要素として認識されます。 ただし、x:Shared
に示されている機能は、WPF アプリケーションと WPF XAML パーサーにのみ関連します。 WPF では、x:Shared
が属性として役立つのは、WPF ResourceDictionary 内に存在するオブジェクトに適用される場合のみです。 その他の使用法では、解析の例外やその他のエラーはスローされませんが、効果はありません。
x:Shared
の意味は、XAML 言語仕様に規定されていません。 他の XAML 実装 (.NET XAML サービス上に構築されているものなど) でリソース共有がサポートされているとは限りません。 このような XAML 実装には、x:Shared
値も使用する同様の動作がサポート フレームワークに用意されている可能性があります。
WPF の場合、リソースの既定の x:Shared
条件は true
です。 この条件は、特定のリソース要求から常に同じインスタンスが返されることを意味します。
FindResource などのリソース API を介して返されるオブジェクトを変更するか、ResourceDictionary 内のオブジェクトを直接変更することで、元のリソースが変更されます。 そのリソースへの参照が動的リソース参照であった場合、そのリソースのコンシューマーによって変更されたリソースが取得されます。
そのリソースへの参照が静的リソース参照であった場合、XAML の処理時間後のリソースへの変更は無関係です。 静的リソース参照と動的リソース参照の違いに関する詳細については、「XAML リソースの概要 (WPF .NET)」を参照してください。
明示的に x:Shared="true"
を指定することはほとんどありません。これは、既に既定値であるためです。 WPF オブジェクト モデルには、x:Shared
に相当する直接的なコードはありません。XAML の使用法でのみ指定することができます。また、処理するには、既定の WPF 動作を使用するか、.NET XAML サービスとその XAML リーダーを使用して処理する場合に読み込みパス上にある中間の XAML ノード ストリームで行う必要があります。
x:Shared="false"
のシナリオは、FrameworkElement または FrameworkContentElement 派生クラスをリソースとして定義してから、要素リソースをコンテンツ モデルに導入する場合です。 x:Shared="false"
を使用すると、1 つの要素リソースを同じコレクション (UIElementCollection など) に複数回導入できます。 x:Shared="false"
がない場合、コレクションによりそのコンテンツの一意性が強制されるため、これは無効です。 ただし、x:Shared="false"
の動作により、同じインスタンスが返されるのではなく、同じリソースのインスタンスがもう 1 つ作成されます。
x:Shared="false"
のもう 1 つのシナリオとして、アニメーション値に Freezable リソースを使用し、アニメーションごとにリソースを変更したい場合があります。
false
の文字列処理では、大文字と小文字は区別されません。
WPF の場合、x:Shared
は次の条件下でのみ有効です。
x:Shared
の項目を含む ResourceDictionary をコンパイルする必要があります。 ResourceDictionary を Loose XAML 内に配置したり、テーマに使用したりすることはできません。複数の項目を含む ResourceDictionary を、別の ResourceDictionary 内に入れ子にすることはできません。 たとえば、既に ResourceDictionary 項目である Style 内にある ResourceDictionary 内で、項目に
x:Shared
を使用することはできません。
関連項目
.NET Desktop feedback