Почему я получаю IOException, когда пытаюсь использовать файл изображения, который был добавлен в проект в качестве ссылки? - PullRequest
2 голосов
/ 16 сентября 2009

У меня есть 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;
    }
}

Проблема:

Этот конвертер работал нормально, пока я не попытался использовать его с файлом, который был добавлен в проект в качестве ссылки (Solution Explorer -> Add Existing Item -> Add As Link). 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 или ожидаемое поведение? Есть ли обходной путь, или «Добавить как ссылку» просто не подходит для файлов содержимого изображения?

Edit:

Хорошо, я нашел обходной путь. Вот мой пересмотренный класс конвертера:

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 со связанным файлом. Но почему?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2009

Ответ должен использовать pack://siteoforigin:,,,/ вместо pack://application:,,,/.

pack://siteoforigin работает с любым файлом содержимого, который копируется в папку bin / Debug или bin / Release (или любую подпапку внутри), независимо от того, был ли файл добавлен в проект в виде ссылки или как обычно.

path://application работает только для файлов содержимого, которые обычно добавляются (не как ссылка).

1 голос
/ 16 сентября 2009

pack: // схема uri используется только для файлов внутри каталогов ресурсов, в противном случае, если вы просто добавите файл или добавите файл в качестве ссылки и установите его тип «content», он будет только копировать файл в вашу корзину. папка, но она не будет упакована в каталоги ресурсов приложения.

Таким образом, для файла, который существует в каталоге как отдельный файл, вы не можете использовать схему URI пакета, вы должны использовать схему URI файла, которая является нормальным путем. Это поведение не зависит от того, добавлен ли файл в виде ссылки или скопирован, но зависит от способа экспорта файла.

...