首页 > 解决方案 > WPF - 为什么在运行时从相对路径加载图像会失败*除非*我在调试器中检查对象?

问题描述

为此制作了一个新的测试项目,带有一个按钮和一个图像。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 社区。

我很困惑为什么会这样。

标签: wpfimageurivisual-studio-2019

解决方案


这看起来像一个错误。一种解决方法是设置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;
}

推荐阅读