wpf - 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 社区。
我很困惑为什么会这样。
解决方案
这看起来像一个错误。一种解决方法是设置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;
}
推荐阅读
- swift - 在iOS中重新启动应用程序时,防止在启动屏幕后出现上次访问的视图?
- php - 在 WordPress 小部件中获取页面 ID
- java - java.util.InputMismatchException 正在发生
- spring - Spring Security 和 Websocket 的 CORS 问题
- python - 如何在索引时为 Timeseries 添加列名
- doctrine-orm - Doctrine2:PreFlush 钩子超时
- structure - 在 ABAP 中使用动态结构字段
- javascript - 有没有办法让 webrtc 视频录制在端口被阻塞的安全网络上工作?
- shell - shell脚本如何读取批处理测试文件夹中的数据
- python - 熊猫应用多个大于和小于按特定列分组行