WPF 的Image 控件 设置 Image.Source 的数据源,可能存在跨线程调用的问题。
相信很多WPF 的开发,应该都很多用到 Image 这个控件来显示图片。这个图片的来源可以来自各种各样的方式获取到。
我们的组内白板、批注的扫码的功能也用到这个去生成二维码,生成后,二维码显示不出来,由于触发到了全局捕获,界面又没有崩溃,遇到了好几个坑,记录一下。
开始看代码:
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
ImageSource imageSource = null; //用来模拟时间回调后,去获取图片资源
Task.Run(() =>
{
imageSource = BitmapImageToBitmap();
}); await Task.Delay(2000);
MyImage.Source = imageSource; } public static BitmapImage BitmapImageToBitmap()
{
BitmapImage bitmapImage = new BitmapImage(new Uri(@"C:\Users\a\Desktop\祁厅长壁纸.png", UriKind.RelativeOrAbsolute));
return bitmapImage;
}
我们在工作线程上去获取ImageSource (模拟事件回调),然后在Loaded 事件中给 Image控件的Source 赋值。

其实细看一下ImageSource 的定义,是继承了 Animatable,而Animatable继承了Freezable,Animatable继承了Freezable,Freezable继承了DependencyObject

这也就是说,ImageSource 的创建和使用必须是同一个线程下的,不然就会存在以上的异常报错
Freezable.Freeze Method (System.Windows) | Microsoft Learn
解决方法:
BitmapImage 在获取图片的时候,提供了Freenze()的方法
public static BitmapImage BitmapImageToBitmap()
{
BitmapImage bitmapImage = new BitmapImage(new Uri(@"C:\Users\a\Desktop\祁厅长壁纸.png", UriKind.RelativeOrAbsolute)); if (bitmapImage.CanFreeze)
{
bitmapImage.Freeze();
} return bitmapImage;
}
加上就可以正常显示了,效果如下:

WPF 的Image 控件 设置 Image.Source 的数据源,可能存在跨线程调用的问题。的更多相关文章
- SplendidCRM中给来自EditView中的listbox控件设置选中值或数据源
DropDownList list = this.findContol("aas") as DropDownList;list.DataSource = new DataTable ...
- WPF中Image控件的Source属性
原文:WPF中Image控件的Source属性 imgBook 是一个Image控件,在后台代码中我想给它指定Source的属性.我先如下方式进行: Uri uri = new Uri(strImag ...
- WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画
原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同 ...
- WPF中Ribbon控件的使用
这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可 ...
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步
深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
- WPF 在image控件用鼠标拖拽出矩形
原文:WPF 在image控件用鼠标拖拽出矩形 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee ...
- WPF 4 DataGrid 控件(基本功能篇)
原文:WPF 4 DataGrid 控件(基本功能篇) 提到DataGrid 不管是网页还是应用程序开发都会频繁使用.通过它我们可以灵活的在行与列间显示各种数据.本篇将详细介绍WPF 4 中 ...
- WPF 4 DataGrid 控件(自定义样式篇)
原文:WPF 4 DataGrid 控件(自定义样式篇) 在<WPF 4 DataGrid 控件(基本功能篇)>中我们已经学习了DataGrid 的基本功能及使用方法.本篇将继续 ...
- WPF Calendar 日历控件 样式自定义
原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...
随机推荐
- DOCKER20231217: 容器引擎Docker
1.1 Docker简介 1.1.1 什么是Docker? 一种轻量级的操作系统虚拟化技术,基于Go语言实现的开源容器项目,诞生于2013年,最初发起者是dotCloud公司(现 Docker Inc ...
- Appflowy cloud 部署测试避坑指南
在进行 Appflowy cloud 部署测试时,我可谓是踩坑无数.下面,我想从几个关键方面来分享一下我的经验. 先给大家讲讲我的基础情况.Appflowy cloud 的部署是在 docker 环境 ...
- 写于vue3.0发布前夕的helloworld之二
接着,继续走,来到了vm.$mount. 开始生成render函数,生成VNode,由于是第一次加载,所以patch机制为只删除前一个dom节点机制,下面都会讲到. 先到$mount: Vue.pro ...
- 人工智能-A*算法-八数码问题
一,A*算法设计思想 A*算法(A-star)是一种寻路算法,主要用于游戏.机器人等领域. 它的设计思想是将最短路径搜索问题转化为一个优化问题,通过计算每个节点的评分(f(n) = g(n) + h( ...
- 查看SELinux状态:
1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态SELinux status: enabl ...
- English interview - three interesting questions of algorithm analysis (英语面试- 三道有趣的算法分析题目)
Background introduction Here are some problems related to Big-O notation. From now on, I will try to ...
- 数据结构-ArrayList-LinkedList--java进阶day09
1.数据结构 2.栈 详细流程:https://kdocs.cn/l/claZP6piLKDW?linkname=150996989 3.队 详细流程:https://kdocs.cn/l/claZP ...
- String类的三种常见构造方法
1.根据构造方法创建字符串对象 1.public String() 创建一个空字符串,里面不包含任何内容 2.public String(char[] chs) 创建一个字符数组,将其拼接成字符串对象 ...
- Ink 和 TravisCI 更配哦
前言 去年还是前年,无意间接触到ink,看到是用go写的,非常小巧和精简,于是乎fork了下,还整了个供ink用的docker镜像``. 不过那时候热衷于折腾博客...结果也没折腾出什么来, 今天整理 ...
- 垂直模型和AI Workflow是开AGI的历史倒车
提供AI咨询+AI项目陪跑服务,有需要回复1 RL 之父 Rich Sutton在 2019 年的文章<苦涩的教训>中指出: 70 年的 AI 研究历史告诉我们一个最重要的道理:依靠纯粹算 ...