アプリケーション データ ファイル (「Windows Presentation Foundation のアプリケーション データ ファイル」を参照) を識別するために、WPF は、パッケージの URI スキームと呼ばれる、広く知られている拡張可能な統一リソース識別子 (URI) ベースの機構を利用します。パッケージの URI スキームが持つ拡張性により、WPF は、さまざまな場所に存在している可能性がある複数の種類のアプリケーション データ ファイルを、一貫性のある 1 種類の方法で識別することができます。
このトピックには次のセクションが含まれています。
パッケージの URI スキーム
Open Packaging Conventions (OPC) 仕様には、コンテンツを編成、識別するためのモデルが記載されています。このモデルの中核となるのは、パッケージとパーツの 2 つの論理エンティティです。パッケージは、次の図に示すように、1 つ以上のコンテンツ パーツを格納するコンテナです。
これらのパーツを識別できるようにするために、OPC は RFC 2396 の拡張機能を利用して、パッケージの URI スキームを定義します。URI で指定されるスキームは、そのプレフィックスで定義されます。http、ftp、file などのプレフィックスがよく知られています。パッケージの URI スキームは、pack をそのスキームとして使用し、証明機関とパスの 2 つのコンポーネントを含みます。authority は、パーツが格納されているパッケージの種類を指定し、path は、パッケージ内のパーツの場所を指定します。この概念を次の図に示します。
パッケージの URI スキームに準拠する URI は、"パッケージの URI" と呼ばれ、次の形式を使用します。
pack://<authority><path>
パッケージとパーツという概念は、アプリケーションとアプリケーション データ ファイルに似ています。つまり、アプリケーション (パッケージ) には、次のような 1 つ以上のアプリケーション データ ファイル (パーツ) を含めることができます。
-
ローカル アセンブリにコンパイルされるリソース ファイル。
-
参照アセンブリにコンパイルされるリソース ファイル。
-
参照元のアセンブリにコンパイルされるリソース ファイル。
-
コンテンツ ファイル。
-
起点サイト ファイル。
これら 4 種類のアプリケーション データ ファイルにアクセスするために、WPF は、application:/// と siteoforigin:/// という 2 つの証明機関をサポートします。application:/// 証明機関は、リソース ファイルとコンテンツ ファイルの両方を含む、コンパイル時に認識されるアプリケーション データ ファイルを識別するために使用されます。siteoforigin:/// 証明機関は、起点サイト ファイルを識別するために使用されます。
メモ : |
|---|
| パッケージの URI の証明機関コンポーネントは、パッケージを指す埋め込みの URI で、RFC 2396 に準拠する必要があります。また、"/" 文字は "," 文字に置き換え、"%" や "?" などの予約された文字はエスケープする必要があります。詳細については、OPC を参照してください。 |
各証明機関のスコープを、次の図に示します。
以下のトピックでは、2 つの証明機関をパスと組み合わせて使用してパッケージの URI を構築し、リソース ファイル、コンテンツ ファイル、および起点サイト ファイルを識別する方法について説明します。
リソース ファイルのパッケージ URI - ローカル アセンブリ
ローカル アセンブリにコンパイルされるリソース ファイルのパッケージ URI は、次の証明機関とパスを使用します。
ローカル アセンブリのプロジェクト フォルダのルートにある XAML リソース ファイルのパッケージ URI の例を次に示します。
pack://application:,,,/ResourceFile.xaml
ローカル アセンブリのプロジェクト フォルダのサブフォルダにある XAML リソース ファイルのパッケージ URI の例を次に示します。
pack://application:,,,/Subfolder/ResourceFile.xaml
リソース ファイルのパッケージ URI - 参照アセンブリ
参照アセンブリにコンパイルされるリソース ファイルのパッケージ URI は、次の証明機関とパスを使用します。
参照アセンブリのプロジェクト フォルダのルートにある XAML リソース ファイルのパッケージ URI の例を次に示します。
pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
参照アセンブリのプロジェクト フォルダのサブフォルダにある XAML リソース ファイルのパッケージ URI の例を次に示します。
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml
バージョン固有の参照アセンブリのプロジェクト フォルダのルート フォルダにある XAML リソース ファイルのパッケージ URI の例を次に示します。
pack://application:,,,/ReferencedAssembly;v1.0.0.1;component/ResourceFile.xaml
コンテンツ ファイルのパッケージ URI
コンテンツ ファイルのパッケージ URI は、次の証明機関とパスを使用します。
実行可能アセンブリと同じフォルダにある XAML コンテンツ ファイルのパッケージ URI の例を次に示します。
pack://application:,,,/ContentFile.xaml
アプリケーションのメインの実行可能アセンブリのファイル システムの場所に対して相対的なサブフォルダにある XAML コンテンツ ファイルのパッケージ URI の例を次に示します。
pack://application:,,,/Subfolder/ContentFile.xaml
起点サイト ファイルのパッケージ URI
起点サイト ファイルのパッケージ URI は、次の証明機関とパスを使用します。
実行可能アセンブリが起動される場所に格納されている、XAML 起点サイト ファイルのパッケージ URI の例を次に示します。
pack://siteoforigin:,,,/SiteOfOriginFile.xaml
実行可能アセンブリが起動される場所のサブフォルダに格納されている、XAML 起点サイト ファイルのパッケージ URI の例を次に示します。
pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml
絶対パッケージ URI と相対パッケージ URI
完全修飾パッケージ URI には、スキーム、証明機関、パスが含まれ、絶対パッケージ URI と見なされます。開発者にとっての簡便さを考慮して、通常、XAML 要素では、パスだけを含む相対パッケージ URI で適切な属性を設定できます。
たとえば、ローカル アセンブリ内のリソース ファイルに対する次の絶対パッケージ URI を考えてみます。
pack://application:,,,/ResourceFile.xaml
このリソース ファイルを参照する相対パッケージ URI は、次のようになります。
/ResourceFile.xaml
メモ : |
|---|
| 起点サイト ファイルにアセンブリとの関連付けがないため、パッケージ URI を使用した参照だけが可能です。 |
既定では、相対パッケージ URI 参照は、参照を含むマークアップ ファイルまたはコード ファイルに対して相対的であると見なされます。ただし、先頭にバックスラッシュを使用すると、相対パッケージ URI 参照はアプリケーションのルートに対して相対的であると見なされます。たとえば、次のプロジェクト構造を考えます。
App.xaml
Page2.xaml
\SubPages
Page1.xaml
Page2.xaml
Page1.xaml で、SubPages フォルダ内にある Page2.xaml ファイルに対する相対パッケージ URI を作成する場合は、以下を使用できます。
Page2.xaml
ただし、Page1.xaml で、ルート フォルダ内にある Page2.xaml ファイルに対する相対パッケージ URI を作成する場合は、以下を使用できます。
Page1.xaml
パッケージ URI の解決
パッケージ URI の形式は、パッケージ URI がローカルのリソース ファイルとコンテンツ ファイルの両方で同じに見えるようになっています。
pack://application:,,,/ResourceOrContentFile.xaml
これは、相対 URI にも当てはまります。
/ResourceOrContentFile.xaml
この類似性があるため、WPF では、このようなパッケージ URI がリソース ファイルとコンテンツ ファイルのどちらを参照しているかを判断する手段が必要です。パッケージ URI にはこの種の情報が含まれていないため、WPF は、次のヒューリスティックを使用して URI を解決します。
-
アセンブリ メタデータに、パッケージ URI に一致する AssemblyAssociatedContentFileAttribute があるかどうかを調べます。
-
AssemblyAssociatedContentFileAttribute 属性が見つかった場合は、パッケージ URI のパスはコンテンツ ファイルを参照しています。
-
AssemblyAssociatedContentFileAttribute 属性が見つからない場合、列挙されているローカル アセンブリにコンパイルされた設定リソース ファイルを調べます。
-
パッケージ URI のパスに一致するリソース ファイルが見つかると、パッケージ URI のパスはリソース ファイルを参照しています。
-
リソースが見つからない場合、内部で作成された Uri は無効です。
メモ : |
|---|
| リソース解決には絶対パッケージ URI と相対パッケージ URI だけが含まれます。参照アセンブリ内のコンテンツ ファイルは、WPF でサポートされないため、含まれません。参照アセンブリに埋め込まれたファイルのパッケージ URI は一意です。これらのパッケージ URI には、参照アセンブリの名前と ;component サフィックスの両方が含まれるためです。起点サイト ファイルのパッケージ URI は一意です。これらのパッケージ URI は、siteoforigin:/// 証明機関を使用する唯一のパッケージ URI であるためです。 |
WPF リソース解決を使用すると、アプリケーション データ ファイルの場所に依存しないパッケージ URI を作成できます。そのため、たとえば、実行可能ではないデータ ファイルの種類を Resource から Content にビルドする場合、パッケージ URI は変更する必要がありません。
パッケージ URI を使用したプログラミング
マークアップでのパッケージ URI の使用
マークアップでは、パッケージ URI の文字列値を使用して属性の要素を設定することで、パッケージ URI を指定します。たとえば、次のようになります。
<element attribute="pack://application:,,,/File.xaml" />
マークアップで文字列値を使用して指定できるさまざまな絶対パッケージ URI と相対パッケージ URI を次の表に示します。
表 1 : マークアップでの絶対パッケージ URI と相対パッケージ URI
|
実行不可能なデータ ファイル
|
絶対パック URI
|
| リソース ファイル - ローカル アセンブリ [絶対サイズ] | "pack://application:,,,/File.xaml" |
| サブフォルダ内のリソース ファイル - ローカル アセンブリ [絶対サイズ] | "pack://application:,,,/Subfolder/File.xaml" |
| リソース ファイル - 参照アセンブリ [絶対サイズ] | "pack://application:,,,/ReferencedAssembly;component/File.xaml" |
| サブフォルダ内のリソース ファイル - 参照アセンブリ [絶対サイズ] | "pack://application:,,,/ReferencedAssembly;component/Subfolder/File.xaml" |
| リソース ファイル - バージョン管理された参照アセンブリ [絶対サイズ] | "pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/File.xaml" |
| コンテンツ ファイル [絶対サイズ] | "pack://application:,,,/File.xaml" |
| サブフォルダ内のコンテンツ ファイル [絶対サイズ] | "pack://application:,,,/Subfolder/File.xaml" |
| Site of Origin ファイル [絶対サイズ] | "pack://siteoforigin:,,,/File.xaml" |
| サブフォルダ内の Site of Origin ファイル [絶対サイズ] | "pack://siteoforigin:,,,/Subfolder/File.xaml" |
| リソース ファイル - ローカル アセンブリ [相対] | "/File.xaml" |
| サブフォルダ内のリソース ファイル - ローカル アセンブリ [相対] | "/Subfolder/File.xaml" |
| リソース ファイル - 参照アセンブリ [相対] | "/ReferencedAssembly;component/File.xaml" |
| サブフォルダ内のリソース ファイル - 参照アセンブリ [相対] | "/ReferencedAssembly;component/Subfolder/File.xaml" |
| コンテンツ ファイル [相対] | "/File.xaml" |
| サブフォルダ内のコンテンツ ファイル [相対] | "/Subfolder/File.xaml" |
メモ : |
|---|
| Site of Origin ファイルは、絶対パック URI でのみ参照できます。 |
コードでのパッケージ URI の使用
コードでは、Uri クラスをインスタンス化し、パラメータとしてパッケージ URI をコンストラクタに渡すことでパッケージ URI を指定します。このコード例を次に示します。
Uri uri = new Uri("pack://application:,,,/File.xaml");
既定では、Uri クラスは、URI 参照を絶対と見なします。そのため、相対パッケージ URI を参照する Uri クラスのインスタンスを使用しようとすると、例外が発生します。
Uri uri = new Uri("/File.xaml");
しかし、Uri クラスのコンストラクタの 1 つのオーバーロードは、UriKind 型のパラメータを受け取ります。この型のパラメータを使用すると、URI が絶対または相対のどちらであるかを指定できます。
// Absolute URI (default)
Uri absoluteUri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute);
// Relative URI
Uri relativeUri = new Uri("/File.xaml", <b>UriKind.Relative</b>);
提供されたパッケージ URI が Absolute と Relative のどちらであるかわかっている場合は、それだけを指定します。ただし、コンパイル時にパッケージ URI が絶対か相対かわからない場合があります。たとえば、アプリケーションが実行時にユーザー指定のパッケージ URI (絶対か相対のいずれか) を受け取る場合があります。この場合は、代わりに RelativeOrAbsolute を使用します。
// Relative or Absolute URI
TextBox userProvidedUriTextBox = new TextBox();
Uri uri = new Uri(userProvidedUriTextBox.Text, UriKind.RelativeOrAbsolute);
コードで T:System.Uri を使用して指定できるさまざまな絶対パッケージ URI と相対パッケージ URI を次の表に示します。
表 2 : コードでの絶対パッケージ URI と相対パッケージ URI
|
実行不可能なデータ ファイル
|
絶対パック URI
|
| リソース ファイル - ローカル アセンブリ [絶対サイズ] | Uri uri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute"); |
| サブフォルダ内のリソース ファイル - ローカル アセンブリ [絶対サイズ] | Uri uri = new Uri("pack://application:,,,/Subfolder/File.xaml", UriKind.Absolute"); |
| リソース ファイル - 参照アセンブリ [絶対サイズ] | Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/File.xaml", UriKind.Absolute"); |
| サブフォルダ内のリソース ファイル - 参照アセンブリ [絶対サイズ] | Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/Subfolder/File.xaml", UriKind.Absolute"); |
| リソース ファイル - バージョン管理された参照アセンブリ [絶対サイズ] | Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/File.xaml", UriKind.Absolute"); |
| コンテンツ ファイル [絶対サイズ] | Uri uri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute"); |
| サブフォルダ内のコンテンツ ファイル [絶対サイズ] | Uri uri = new Uri("pack://application:,,,/Subfolder/File.xaml", UriKind.Absolute"); |
| Site of Origin ファイル [絶対サイズ] | Uri uri = new Uri("pack://siteoforigin:,,,/File.xaml", UriKind.Absolute"); |
| サブフォルダ内の Site of Origin ファイル [絶対サイズ] | Uri uri = new Uri("pack://siteoforigin:,,,/Subfolder/File.xaml", UriKind.Absolute"); |
| リソース ファイル - ローカル アセンブリ [相対] | Uri uri = new Uri("/File.xaml", UriKind.Relative"); |
| サブフォルダ内のリソース ファイル - ローカル アセンブリ [相対] | Uri uri = new Uri("/Subfolder/File.xaml", UriKind.Relative"); |
| リソース ファイル - 参照アセンブリ [相対] | Uri uri = new Uri("/ReferencedAssembly;component/File.xaml", UriKind.Relative"); |
| サブフォルダ内のリソース ファイル - 参照アセンブリ [相対] | Uri uri = new Uri("/ReferencedAssembly;component/Subfolder/File.xaml", UriKind.Relative"); |
| コンテンツ ファイル [相対] | Uri uri = new Uri("/File.xaml", UriKind.Relative"); |
| サブフォルダ内のコンテンツ ファイル [相対] | Uri uri = new Uri("/Subfolder/File.xaml", UriKind.Relative"); |
メモ : |
|---|
| Site of Origin ファイルは、絶対パック URI でのみ参照できます。 |
参照