WPF - Почему загрузка изображения с относительного пути во время выполнения не удалась *, если * я не проверил объект в отладчике? - PullRequest
0 голосов
/ 10 февраля 2020

Сделал новый тестовый проект только для этого, с кнопкой и изображением. MyImage.png находится в рабочем каталоге отладки проекта и НЕ включается в проект.

Это прекрасно работает с указанием абсолютного пути:

private void BtnLoadFromFile_Click(object sender, RoutedEventArgs e)
{
    Uri fileUri = new Uri("C:/blah/blah/blah/MyImage.png");
    BitmapImage myimage = new BitmapImage(fileUri);
    Imagebox.Source = myimage;
}

Это НЕ показывает никакого изображения , с относительным путем:

private void BtnLoadFromFile_Click(object sender, RoutedEventArgs e)
{
    Uri fileUri = new Uri("MyImage.png", UriKind.Relative);
    BitmapImage myimage = new BitmapImage(fileUri);
    Imagebox.Source = myimage;
}

Однако я заметил, что относительный путь работает, если я установил точку останова в последней строке, проверил свойства myimage (он содержит данные, указывающие, что MyImage.png был успешно найден) , а затем продолжить исполнение. В этот момент изображение появляется. Я пользуюсь Visual Studio 2019 Community.

Я очень озадачен, почему это происходит.

1 Ответ

0 голосов
/ 10 февраля 2020

Это похоже на ошибку. Обходной путь должен был бы установить BitmapCacheOption.OnLoad:

private void BtnLoadFromFile_Click(object sender, RoutedEventArgs e)
{
    var fileUri = new Uri("MyImage.png", UriKind.Relative);
    var myImage = new BitmapImage();
    myImage.BeginInit();
    myImage.UriSource = fileUri;
    myImage.CacheOption = BitmapCacheOption.OnLoad;
    myImage.EndInit();
    Imagebox.Source = myImage;
}

Или всегда использовать абсолютный URI:

private void BtnLoadFromFile_Click(object sender, RoutedEventArgs e)
{
    var fileUri = new Uri(Path.Combine(Environment.CurrentDirectory, "MyImage.jpg"));
    var myImage = new BitmapImage(fileUri);
    Imagebox.Source = myImage;
}
...