6

ファイル システムに保持されているファイルからいくつかの BitmapImages を読み込もうとしています。キーと相対ファイルパスの辞書があります。残念ながら、Uri コンストラクターは、画像を読み込む方法が非決定的であるようです。

これが私のコードです:

foreach(KeyValuePair<string, string> imageLocation in _imageLocations)
{
    try
    {
        BitmapImage img = new BitmapImage();
        img.BeginInit();
        img.UriSource = new Uri(@imageLocation.Value, UriKind.Relative);

        img.EndInit();
        _images.Add(imageLocation.Key, img);
    }
    catch (Exception ex)
    {
        logger.Error("Error attempting to load image", ex);

    }
}

残念ながら、Uris が相対ファイル Uris としてロードされることもあれば、相対パック Uris としてロードされることもあります。どちらがどのようにロードされるかについて、韻や理由はないようです。すべての Uris が 1 つの方法で読み込まれることもあれば、いくつかの方法で読み込まれることもあれば、ほとんどの場合、コードを実行するたびに変更されることもあります。

ここで何が起こっているのですか?

4

2 に答える 2

3

まあ、ちょっと... MSDNはUriKindについてこう言っています:

絶対 URI はリソースへの完全な参照 (例: http://www.contoso.com/index.html )によって特徴付けられますが、相対 URI は以前に定義されたベース URI (例: /index.html) に依存します。

リフレクターに飛び込んで周りを見渡すと、相対 URI がどうあるべきかを解決するためにコードがたどるパスがたくさんあることがわかります。とにかく、それが非決定論的というわけではなく、多くの開発者にとってフラストレーションの主な原因になっているだけです。できることの 1 つは、「BaseUriHelper」クラスを使用して、uris がどのように解決されているかを理解することです。

一方、リソースがどこに保存されているかを知っている場合 (そうするべきです) は、頭を悩ませずに絶対 URI を使用してリソースを解決することをお勧めします。いつでも機能し、予期せぬときにつまずく舞台裏のコードはありません。

于 2011-04-21T13:06:10.337 に答える
1

最後に、アプリのベース ディレクトリを取得し、それに相対パスを追加し、相対 URI ではなく絶対 URI を使用することで問題を解決しました。

string baseDir = AppDomain.CurrentDomain.BaseDirectory;

foreach(KeyValuePair<string, string> imageLocation in _imageLocations)
{
    try
    {
        BitmapImage img = new BitmapImage();
        img.BeginInit();
        img.UriSource = new Uri("file:///" + baseDir + @imageLocation.Value, UriKind.Absolute);

        img.EndInit();
        _images.Add(imageLocation.Key, img);
    }
    catch (Exception ex)
    {
        logger.Error("Error attempting to load image", ex);

    }
}
于 2011-04-28T05:05:56.630 に答える