WPF动态设置Rectangle的ImageBrush图片源抛出异常求助
解决WPF代码动态设置Rectangle图片填充抛出异常的问题
我之前也踩过一模一样的坑——XAML里设置ImageBrush顺风顺水,换成代码动态加载就直接抛异常。结合你的场景来看,问题大概率出在Uri的解析逻辑或者图片的生成操作配置上,下面给你具体的解决方案和原因分析:
核心解决方案:用Pack URI加载内嵌资源
首先先确认你的图片文件配置:右键项目里的oog.png→属性→生成操作,选择Resource(这一步是关键,很多人就是这里没设置对)。然后在代码里用WPF标准的Pack URI来加载图片:
ImageBrush imgBrush = new ImageBrush(); // 绝对Pack URI写法,适配当前程序集的内嵌资源 imgBrush.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Images/oog.png", UriKind.Absolute)); // 或者更简洁的相对URI写法(必须指定UriKind) // imgBrush.ImageSource = new BitmapImage(new Uri("/Images/oog.png", UriKind.Relative));
为什么XAML能工作但代码不行?
XAML解析器会自动把相对路径转换成Pack URI,而代码里直接写普通相对路径的话,WPF会基于程序运行时的工作目录去查找文件——但程序运行时的工作目录通常不是你的项目根目录,自然找不到图片文件,哪怕你觉得路径是对的也没用。
而Pack URI是WPF专门用来引用内嵌资源的标准方式,当图片设置为Resource时,它会被打包进程序集里,不管程序运行在什么路径下都能正确找到。
其他需要排查的细节
- 生成操作不能错:如果图片的生成操作设为
None或者Content,哪怕路径写对了也加载不出来。Resource是最稳定的内嵌资源配置方式。 - 路径拼写要精准:虽然Windows文件系统不区分大小写,但最好保证代码里的路径和实际文件夹/文件名完全一致,避免不必要的解析错误。
- UriKind不能省略:如果用相对URI,一定要加上
UriKind.Relative,不然BitmapImage会默认按绝对URI解析,直接抛出路径无效的异常。
对比你能正常工作的XAML写法
你在XAML里的代码大概是这样的:
<Rectangle Width="200" Height="200"> <Rectangle.Fill> <ImageBrush ImageSource="/Images/oog.png"/> </Rectangle.Fill> </Rectangle>
这里XAML自动帮你把/Images/oog.png转换成了pack://application:,,,/Images/oog.png,所以不需要手动写Pack URI,但代码里必须显式处理这个逻辑。
内容的提问来源于stack exchange,提问作者PIETER BRACKE
相关产品推荐
相关产品推荐

