Ich habe eine IValueConverter
in WPF, die einen relativen Dateipfad in eine BitmapImage
.
Der Kodex:
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;
}
}
Das Problem:
Dieser Konverter funktionierte einwandfrei, bis ich versuchte, ihn mit einer Datei zu verwenden, die dem Projekt als Link hinzugefügt wurde (Projektmappen-Explorer -> Vorhandenes Element hinzufügen -> Als Link hinzufügen). Das Bild der Datei BuildAction
wird eingestellt auf Content
und die Datei wird mit Copy Always
. Die Datei wird auf jeden Fall ordnungsgemäß in den Ordner "bin" kopiert, aber aus irgendeinem Grund bleibt der Konverter stecken, wenn er bei return new BitmapImage(uri)
.
Die Ausnahme:
System.IO.IOException was unhandled
Message="Cannot locate resource 'images/splash.png'."
Source="PresentationFramework"
Fragen:
Kann mir das jemand erklären? Ist dies ein Fehler im .NET Framework oder ist es ein erwartetes Verhalten? Gibt es einen Workaround oder ist "Als Link hinzufügen" einfach keine Option für Bildinhaltsdateien?
Bearbeiten:
Okay, ich habe eine Abhilfe gefunden. Hier ist meine überarbeitete Konverterklasse:
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;
}
}
Offenbar gibt es ein Problem bei der Verwendung einer packuri
mit einer verknüpften Datei. Aber warum?