You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:57:05