В моем текущем проекте мне нужно загрузить файл из Интернета один раз и использовать его в своем приложении WPF позже. Я настроил этот ленивый шаблон загрузки, чтобы загрузить/инициализировать BitmapImage
только по запросу приложения, но, несмотря на все мои усилия, я не могу заставить его работать. Проблема в том, что я получаю IOException
, когда он пытается создать экземпляр BitmapImage
.BitmapImage не может получить доступ к файлу
Ниже я выкладываю полное приложение, что вы можете запускать самостоятельно и прийти с той же проблемой ...
public partial class MainWindow : Window, INotifyPropertyChanged
{
string url = @"http://upload.wikimedia.org/wikipedia/commons/d/d3/Nelumno_nucifera_open_flower_-_botanic_garden_adelaide2.jpg";
string filename = "PrettyFlower.jpg";
Mutex m = new Mutex();
bool isLoaded = false;
BitmapImage flowerImage = null;
public MainWindow()
{
InitializeComponent();
Binding b = new Binding("FlowerImage");
b.Source = this;
img.SetBinding(Image.SourceProperty, b);
}
public BitmapImage FlowerImage
{
get
{
if (isLoaded == false)
{
LoadImage();
return null;
}
return flowerImage;
}
}
private async void LoadImage()
{
WebClient wc = new WebClient();
m.WaitOne();
FileInfo fi = new FileInfo(filename);
if (fi.Exists == false)
{
await wc.DownloadFileTaskAsync(url, filename);
}
flowerImage = new BitmapImage(new Uri("pack://siteOfOrigin:,,,/" + filename));
isLoaded = true;
OnPropertyChanged("FlowerImage");
m.ReleaseMutex();
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
И соответствующие MainWindow.xaml ничего больше, но:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Image x:Name="img"/>
</Window>
я заметьте, что происходит, но, честно говоря, я не понимаю, почему это происходит - то есть, BitmapImage
создается до загрузки, но не должен ли мьютекс предотвращать это поведение?
Хм, я не уверен, что получаю это. Я не ссылаюсь на загруженный файл, как на "pack: // siteOfOrigin: ,,, /" + filename? Например, я думал, что это проблема: / – Kreweta