2 Stimmen

Warum erhalte ich eine IOException, wenn ich versuche, eine Bilddatei zu verwenden, die dem Projekt als Link hinzugefügt wurde?

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?

2voto

devuxer Punkte 40605

Die Antwort ist die Verwendung von pack://siteoforigin:,,,/ statt pack://application:,,,/ .

pack://siteoforigin funktioniert mit jeder Inhaltsdatei, die in den Ordner bin/Debug oder bin/Release (oder einen beliebigen Unterordner darin) kopiert wird, unabhängig davon, ob die Datei dem Projekt als Link oder normal hinzugefügt wurde.

path://application funktioniert nur für Inhaltsdateien, die normal hinzugefügt werden (nicht als Link).

1voto

Akash Kava Punkte 37863

Das uri-Schema pack:// wird nur für Dateien innerhalb von Ressourcenverzeichnissen verwendet. Wenn Sie sonst einfach eine Datei hinzufügen oder eine Datei als Link hinzufügen und ihren Typ auf "content" setzen, wird die Datei nur in Ihren bin-Ordner kopiert, aber nicht in die Ressourcenverzeichnisse der Anwendung gepackt.

Für die Datei, die im Verzeichnis als einzelne Datei existiert, können Sie also nicht das Pack-Uri-Schema verwenden, sondern müssen das Datei-Uri-Schema verwenden, das dem normalen Pfad entspricht. Dieses Verhalten ist nicht davon abhängig, ob die Datei als Link hinzugefügt oder kopiert wird, sondern davon, wie die Datei exportiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X