2

IValueConverter相対ファイル パスを に変換する WPF がありますBitmapImage

コード:

public class RelativeImagePathToImage : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var relativePath = (string)value;
        if (string.IsNullOrEmpty(relativePath)) return Binding.DoNothing;
        var path = "pack://application:,,,/" + value;
        var uri = new Uri(path);
        return new BitmapImage(uri);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

問題:

このコンバーターは、プロジェクトにリンクとして追加されたファイルで使用しようとするまでは正常に機能していました (ソリューション エクスプローラー -> 既存のアイテムの追加 -> リンクとして追加)。画像ファイルBuildActionは に設定されContent、ファイルは とマークされていますCopy Always。ファイルは間違いなく「bin」フォルダーに適切にコピーされていますが、何らかの理由で、return new BitmapImage(uri).

例外:

System.IO.IOException was unhandled
Message="Cannot locate resource 'images/splash.png'."
Source="PresentationFramework"

質問:

誰かがこれを説明できますか?これは .NET Framework のバグですか、それとも予想される動作ですか? 回避策はありますか、または「リンクとして追加」は画像コンテンツ ファイルのオプションではありませんか?

編集:

わかりました、回避策を見つけました。これが私の改訂されたコンバータークラスです:

public class RelativeImagePathToImage : IValueConverter
{
    private static string _rootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var relativePath = (string)value;
        if (string.IsNullOrEmpty(relativePath)) return Binding.DoNothing;
        var path = _rootPath + "/" + relativePath;
        var uri = new Uri(path);
        return new BitmapImage(uri);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

packuriどうやら、リンクされたファイルで を使用すると、何らかの問題が発生するようです。しかし、なぜ?

4

2 に答える 2

2

答えは、pack://siteoforigin:,,,/ではなく使用することですpack://application:,,,/

pack://siteoforiginファイルがリンクとしてプロジェクトに追加されたか、通常どおりにプロジェクトに追加されたかに関係なく、bin/Debugまたはbin/Releaseフォルダー(またはその中のサブフォルダー)にコピーされるすべてのコンテンツファイルで機能します。

path://application(リンクとしてではなく)通常どおりに追加されたコンテンツファイルに対してのみ機能します。

于 2009-09-16T17:24:10.167 に答える
1

pack:// uri スキームは、リソース ディレクトリ内のファイルにのみ使用されます。それ以外の場合は、ファイルを追加するか、ファイルをリンクとして追加し、そのタイプを「コンテンツ」に設定すると、bin フォルダーにファイルがコピーされるだけですが、アプリケーション リソース ディレクトリ内にはパックされません。

そのため、個別のファイルとしてディレクトリに存在するファイルについては、pack uri スキームを使用できず、通常のパスである file uri スキームを使用する必要があります。この動作は、ファイルがリンクとして追加されるかコピーされるかに依存せず、ファイルのエクスポート方法に依存します。

于 2009-09-16T06:28:39.567 に答える