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