WPF MVVM模式图片占用问题

news2024/9/21 2:06:17

在很久以前就遇到这个问题,当时解决了,这过了几年,又遇到这个问题,这里做个总结,防止下次再踩坑了,也顺便帮助一下同样遇到这个问题的朋友 。

出现这个问题的原因是:将文件路径绑定到Image的Source上

ImageSource属性实际上需要的是一个ImageSource类型,但是可以直接将string(文件路径)绑定到Source上。我查了一下WPF的源码,并没有找到是如何在绑定时将string转换成ImageSource。不过原理应该还是下面这样,所以会导致图片文件占用。

Image image = new Image();
image.BeginInit();
image.UriSource = new Uri(xxx);
image.EndInit();

下面看一下文件占用的情况:

如下:

MainWindow.xaml

1  <Grid>
2         <Image Source="{Binding ImagePath}"/>
3  </Grid>

MainWindow.xaml.cs

 1  public partial class MainWindow : Window
 2     {
 3         public MainWindow()
 4         {
 5             InitializeComponent();
 6 
 7             var viewModel = new MainWindowViewModel();
 8             this.DataContext = viewModel;
 9 
10             //假设D盘下有个d.jpeg文件
11             viewModel.ImagePath = @"D:\\d.jpeg";
12         }
13     }

MainWindowViewModel.cs

 1 public class MainWindowViewModel : INotifyPropertyChanged
 2     {
 3         private string imagePath;
 4 
 5         public string ImagePath
 6         {
 7             get => imagePath;
 8             set
 9             {
10                 imagePath = value;
11                 RaiseChanged("ImagePath");
12             }
13         }
14 
15         public event PropertyChangedEventHandler PropertyChanged;
16 
17         public void RaiseChanged(string propertyName)
18         {
19             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
20         }
21     }

运行后可以看到D盘下的d.jpeg文件是不能删除的

解除文件占用的原理是在初始化时,就将图片加载到内存中,如下:

1 image.BeginInit();
2 image.CacheOption = BitmapCacheOption.OnLoad;
3 image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
4 image.UriSource = new Uri(path, UriKind.Absolute);
5 image.EndInit();

了解原理后,我们就可以建立一个ImageSourceConvert来解除文件占用的问题

 1 public class ImageSourceConverter : IValueConverter
 2     {
 3         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 4         {
 5             if (value == null)
 6                 return DependencyProperty.UnsetValue;
 7 
 8             var path = value.ToString();
 9             BitmapImage image = new BitmapImage();
10             image.BeginInit();
11             image.CacheOption = BitmapCacheOption.OnLoad;
12             image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
13             image.UriSource = new Uri(path, UriKind.Absolute);
14             image.EndInit();
15             return image;
16         }
17 
18         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
19         {
20             throw new NotImplementedException();
21         }
22     }

MainWindow.xaml

1  <Window.Resources>
2         <local:ImageSourceConverter x:Key="ImageSourceConverter"/>
3     </Window.Resources>
4     <Grid>
5         <!--<Image Source="{Binding ImagePath}"/>-->
6         <Image Source="{Binding ImagePath,Converter={StaticResource ImageSourceConverter}}"/>
7     </Grid>

示例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF [安洵杯 2019]easy_serialize_php 1

打开题目&#xff0c;看到一串php代码&#xff0c;试着代码审计一下&#xff0c;看一下有用信息 可以看出是通过$_SESSION[img]来读取文件 extract可以将数组中的变量导入当前变量表 也就是说我们可以伪造$_SESSION 数组中的所有数据 这里传递一个参数fphpinfo 先用hackbar进…

软件工程课程实习报告(仅供参考)

一&#xff1a;实习内容设计与实现&#xff1a; 实习一&#xff1a;Git分布式版本控制 本实验的主要目的是学习和掌握Git作为版本控制工具的基本使用方法&#xff0c;特别是在团队协作开发中的重要性。具体目标包括&#xff1a; 1. 理解Git的基本概念和工作原理&#xff0c;…

【AI】可变形卷积Deformable Conv

卷积对大家来说并不陌生了&#xff0c;这里主要描述Deformable Conv。其在论文中也是常见的一个术语&#xff0c;Deformable Convolutional Networks(DCN) 还可以细分成可变形卷积、对候选区域的池化等。 传统卷积操作 将特征图分成一个个与卷积核大小相同的部分&#xff0c;…

k8s—部署dashboard可视化界面

1、下载recommended.yaml配置文件 1&#xff09;根据自己安装的kubernetes版本安装适配的dashboard 我安装的kubernetes是1.24.2版本的&#xff0c;需要安装v:2.6.1版本的dashboard 2&#xff09;下载地址&#xff1a;https://raw.githubusercontent.com/kubernetes/dashboa…

【机器学习】神经网络的无限可能:从基础到前沿

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 在当今人工智能的浪潮中&#xff0c;神经网络作为其核心驱动力之一&#xff0c;正以前所未有的速度改变着我们的世界。从图像识别到自然语言处理&#xff0c;从自动驾驶到医疗诊断&#xff0c;神经网络的…

electron 配置、打包 -报错解决

目录 一、配置途中遇到的问题&#xff1a; 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题&#xff1a; 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个&#xff0c;然后再重新装依赖 1. 采用新的镜像地址 npm …

proteus仿真c51单片机(二)中断控制流水灯(电路设计及代码)

实验要求 8路流水灯&#xff0c;K1和K2都未按下时&#xff0c;主程序执行LED流水灯程序&#xff0c;K1按下时&#xff0c;左右4只LED交替闪烁&#xff0c;K2按下时8只LED全部闪烁4次&#xff0c;设置外部中断1为高优先级。 实验步骤 1、打开PROTEUS软件选取元件&#xff0c…

未授权访问漏洞(重点版─=≡Σ(((つ•̀ω•́)つ)

1.* Redis 搭建靶场环境&#xff1a; 进入目录:cd/vulhub-master/redis/4-unacc 启动:docker-compose up-d 检查:docker-compose ps vi docker-compose.yml //查看端口和版本号 安装redis工具 在kali上安装redis进行服务链接 #安装redis apt-get install redis #redi…

GD 32 IIC 驱动代码

前言&#xff1a; 学会IIC驱动的原理&#xff0c;时序和代码实现 1.0 GPIO初始化 从原理图中可以看出IIC对应的时钟线和数据线在PB端口&#xff0c;因此需要初始化GPIOB的时钟&#xff0c;同时初始化GPIOB_PIN_6 | 7,的引脚&#xff0c;设置为开漏输出模式。 什么事开漏&…

构建二叉树并后序遍历

题目来源&#xff1a;牛客网清华考研oj题 http://www.nowcoder.com/questionTerminal/4b91205483694f449f94c179883c1fef 题目&#xff1a;如下图 答案&#xff1a;如下图 #include<stdio.h> #include<stdlib.h>typedef struct TreeNode{char val;struct TreeNod…

java之IO篇高级流——缓冲流、转化流、序列化流、打印流、压缩流

前言 上一篇IO流就介绍了File和基本流&#xff0c;这节介绍好用的高级流。 还有IO流的心得&#xff1a;随用随创建&#xff0c;什么时候不用什么时候关闭 目录 前言 一、缓冲流 1.体系图 2.字节缓冲流 &#xff08;1&#xff09;用法 &#xff08;2&#xff09;底层原理 …

JavaSE之常用API(前一部分)

一、String 1.1 是什么 String字符串类,底层就是一个字符数组,所以字符串很多特性就是数组的特征 1 字符串一旦创建,不能修改 2 为了提高字符串的访问效率,Java提供了一种缓存技术,字符串常量池 3 如果是用" " 就不会再堆内存创建对象,而是直接再常量池进行搜索,如果…

Java反序列化漏洞实战:原理剖析与复现步骤

文章目录 java反序列化概念数据示例Ysoserial工具使用概念原生态api第三方组件概念复现 反序列化示例靶场过程 在现代应用程序开发中&#xff0c;Java反序列化漏洞已成为一个备受关注的安全问题。反序列化是Java中用于将字节流转换回对象的过程&#xff0c;但如果没有妥善处理&…

搭建PXE实现服务器自动部署

PXE&#xff08;Preboot Execution Environment&#xff09;是一种计算机启动技术&#xff0c;它允许计算机从网络上的服务器而不是从本地硬盘或光盘等存储介质上启动。这种技术主要应用在无盘工作站、网络安装操作系统、远程维护等方面。 环境&#xff1a;一台rhel7.9作为PXE…

Java学习十五—异常处理

一、关于异常 1.1 简介 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是指程序执行过程中可能遇到的意外或错误情况。 Java异常处理是Java语言中一个重要的机制&#xff0c;用于处理程序运行时发生的异常情况。 ​​ 1.2 分类 Java异常分为两大类&#xff1…

STM32 驱动直流无刷电机(BLDC)发声

STM32驱动直流无刷电机(BLDC)发声 ✨需要注意&#xff0c;这是驱动直流无刷电机(BLDC)发出声音&#xff0c;不是直接驱动无刷电机转动。 &#x1f4cd;内容移植参考&#xff1a;ttps://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware&#x1f4cd;Arduino平台BLDC Music开…

小程序开发入门:第一天的学习和实践指南

目录 一. 理解小程序的基本概念 1. 无需安装 2. 快速启动 3. 界面简洁 4. 独立性和封闭性 5. 数据安全 6. 框架结构 7. 生命周期 8. 全局配置 9. API支持 10. 发布和更新 二、选择合适的开发工具 1. 微信开发者工具 2. Visual Studio Code 3. Sublime Text 4. …

荣耀手机怎么录屏?荣耀手机录屏功能全解析

荣耀手机作为一款受欢迎的智能手机品牌&#xff0c;拥有丰富的功能和实用的工具&#xff0c;其中包括强大的录屏功能。然而&#xff0c;对于一些荣耀手机用户来说&#xff0c;如何利用这一功能可能会感到困惑。 在数字化时代&#xff0c;录制屏幕上的内容已成为许多用户分享、…

AOE网及其求解关键路径

全称 Activity on Edge Network 边活动网 特点 仅存在 有向无环图 作用 用于记录完成整个工程至少花费的时间 > 哪条路径最耗时&#xff1f;也就是“ 关键路径 ” AOE网元素介绍 关键活动 关键路径上的活动称为关键活动 &#xff0c; 关键活动是不允许拖延的&#x…

ctfshow-web入门-sql注入(web186-web190)

目录 1、web186 2、web187 3、web188 4、web189 5、web190 1、web186 新增过滤 \%|\<|\>|\^ 采用 regexp 正则表达式的方法来匹配&#xff0c;payload&#xff1a; ^ 表示匹配开头&#xff0c;也就是说我们猜测 flag 的第一个字符是 c tableNamectfshow_user gro…