2016-06-06 4 views
1

Ich versuche gerade, ein Bild in einem WPF-Dialog anzuzeigen, der jederzeit vom Benutzer ersetzt werden kann, wodurch diese Bilddatei überschrieben wird. Mein Problem ist: Während das Bild in meinem Dialog angezeigt wird, scheint das Bild von WPF gesperrt zu sein. Wenn ich versuche, es zu ersetzen, kann es nicht zugegriffen werden.WPF-Datenbindung zu Bilddatei sperrt diese Datei für immer

Wie kann ich WPF zwingen, das Bild zu veröffentlichen, wenn ich ein neues lade? Hier ist ein Teil meines Code:

XAML:

<Image Margin="6" VerticalAlignment="Center" HorizontalAlignment="Center" Source="{Binding ImageFileFullPath}"/> 

C#:

string sourceFile = openFileDialog.FileName; 
string destinationFile = Path.Combine(Environment.ExpandEnvironmentVariables(Constants.ImagePathConstant), destinationFileWithoutPath); 
mViewModel.ImageFileFullPath = ""; //temporarily set the image file to another entry hoping WPF releases my image 
try 
{ 
    File.Copy(sourceFile, destinationFile, true); //fails the second time with exception 
} 
catch (Exception) 
{     
    throw; 
} 

Auch versuchen, das Bild auf einen leeren Pfad zu setzen vorübergehend das Problem nicht beheben.

Ausnahme erhalte ich: Eine nicht behandelte Ausnahme des Typs ‚System.IO.IOException‘ in PresentationFramework.dll aufgetreten

+1

Check http: // Stackoverflow. com/questions/1688545/probleme-überschreiben-wieder-speichern-bild-wenn-es-wurde-als-bild-source gesetzt –

Antwort

1

Ich hatte eine Situation, wo ich den Benutzer benötigt, um ein Bild auszuwählen, anzuzeigen, und dann die Position bewegen des Bildes. Was ich schnell fand, war, während ich an das Bild gebunden war, dass ich ein Dateischloss daran hielt, das mich daran hinderte, es zu bewegen. Auf einer BitmapImage gibt es eine CacheOption, mit der Sie OnLoad zwischenspeichern können. Leider konnte ich das nicht für das Bild auf die Bindungen so eingestellt, um es zu bekommen Ich hatte einen Konverter auf der Quelle zu verwenden:

public class ImageCacheConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 

     var path = (string)value; 
     // load the image, specify CacheOption so the file is not locked 
     var image = new BitmapImage(); 
     image.BeginInit(); 
     image.CacheOption = BitmapCacheOption.OnLoad; 
     image.UriSource = new Uri(path); 
     image.EndInit(); 

     return image; 

    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException("Not implemented."); 
    } 
} 

XAML:

<Image Source="{Binding Path=SmallThumbnailImageLocation, Converter=StaticResource imagePathConverter}}"/> 
Verwandte Themen