URL の解決方法

Silverlight 2 になってから、 Silvarlight プラグインが読み込んだ xap ファイル、もしくは xaml ファイルの url より上の階層を相対パスで指定できないようになっているみたいです。(ちゃんと検証していないので確信はもてないですが、たぶんそんな感じです。)

つまり、どういうことかというと ClientBin/app.xap を読み込んだとして、この中から "../image/foo.png" と指定しても、見ることができないのです。なぜかリクエストしている URL を調べてみると、 "ClientBin/image/foo.png" になってました。そら 404 です。

で、試しに ClinetBin の下に image/foo.png をおいて、 "image/foo.png" と指定したら、見ることができました。当然といえば当然ですが。。

ちなみにドメインを含んだ絶対パスで "http://localhost/image/foo.png" と指定してやると、見ることができます。でも、こんなの動作環境が変わると一発でアウトです。

解決策

で、考えました。で、発見しました。

System.Windows.Application.Current.Host.Source

ってので、読み込まれた xaml ファイル、もしくは xap ファイルの uri が取得できます。これを使って

new Uri(System.Windows.Application.Current.Host.Source, new Uri("../image/foo.png",UriKind.Relative));

と、してあげると絶対パスが作られて見ることができます。

url が外から渡されて、絶対パス相対パスかわからないパターンだと

var uri = new Uri(imagePath, UriKind.RelativeOrAbsolute);
if(!uri.IsAbsoluteUri)
{
  uri = new Uri(System.Windows.Application.Current.Host.Source, uri);
}

みたいな感じで、対応できますね。


ちなみに、

System.Windows.Browser.HtmlPage.Document.DocumentUri

で、呼び出しページの URL を取得できるのです。こいつを使って解決しようとしても、複数のページから呼ばれることもあるかもしれないので、そういう場合に駄目になってしまいます。なので、やはりお勧めは先のものです。


しかし、一度きっちりと url の動きは調べてみる必要ありです。