Wpf生成操作:内容和资源


🧱 一、生成操作(Build Action)的基本概念

在 Visual Studio 中,文件属性里的 “生成操作(Build Action)” 决定了这个文件在编译时如何被处理、是否会被打包进最终的程序集(.exe 或 .dll)中,或者是否会被复制到输出目录。

常见的选项包括:

  • None(不参与编译)
  • Content(内容文件)
  • Resource(WPF 资源)
  • Embedded Resource(嵌入资源)
  • Page(用于 XAML)
  • Compile(用于代码文件)

我们重点看你提到的这三个:


🎨 二、“内容(Content)”、“资源(Resource)”、“嵌入的资源(Embedded Resource)”的区别

生成操作编译后是否打包进 EXE访问方式典型用途特点
Content(内容)❌ 否(但会复制到输出目录)文件路径(URI 或磁盘路径)图片、配置文件、外部可替换资源文件存在于磁盘上,可以替换或修改
Resource(资源)✅ 是(打包进程序集)pack://application:,,,/路径WPF UI 图片、图标等推荐用于 UI 图片,编译时自动压缩打包
Embedded Resource(嵌入的资源)✅ 是(打包进程序集)程序代码通过 Assembly.GetManifestResourceStream()非 WPF 特有,一般用于代码访问的二进制数据不会被 WPF 资源系统识别

🧩 三、具体区别举例

假设项目中有一个文件结构如下:

1
2
3
4
MyApp/
 ├── Images/
 │    └── logo.png
 └── MainWindow.xaml

1️⃣ Content(内容)

属性设置:

1
2
生成操作: Content
复制到输出目录: 始终复制

编译后:

  • logo.png 会出现在输出目录(如 bin/Debug/net8.0-windows/Images/logo.png)。
  • 不会打包进 .exe

访问方式(XAML):

1
<Image Source="Images/logo.png"/>

访问方式(代码):

1
var image = new BitmapImage(new Uri("Images/logo.png", UriKind.Relative));

✅ 优点:可以替换图片,不用重新编译 ❌ 缺点:发布时需要确保图片随程序一起拷贝


2️⃣ Resource(资源)

属性设置:

1
生成操作: Resource

编译后:

  • logo.png 会被压缩并打包进 MyApp.exe 程序集中。

访问方式(XAML):

1
<Image Source="pack://application:,,,/Images/logo.png"/>

或更简单写法(推荐):

1
<Image Source="/MyApp;component/Images/logo.png"/>

访问方式(代码):

1
2
var uri = new Uri("pack://application:,,,/Images/logo.png");
var image = new BitmapImage(uri);

✅ 优点:

  • 不需要单独拷贝文件。
  • 不怕丢失,发布简单。
  • 是 WPF 的默认推荐方式。

❌ 缺点:

  • 修改图片需要重新编译程序。

3️⃣ Embedded Resource(嵌入的资源)

属性设置:

1
生成操作: Embedded Resource

编译后:

  • 文件会以二进制流形式嵌入到程序集,但不属于 WPF 的资源系统。

访问方式(仅代码):

1
2
3
4
5
6
var assembly = Assembly.GetExecutingAssembly();
using var stream = assembly.GetManifestResourceStream("MyApp.Images.logo.png");
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = stream;
image.EndInit();

✅ 优点:

  • 对于非 WPF 程序(如控制台、WinForms)很方便。 ❌ 缺点:
  • WPF 的 XAML 无法直接识别这种资源。
  • 不推荐在纯 WPF 界面中使用。

💡 四、总结与推荐使用

使用场景推荐生成操作理由
UI 图片(按钮图标、背景)Resource打包在程序集内,URI 可直接访问
可替换图片(用户可更改)Content放在输出目录中,可替换
嵌入配置/模板文件(仅代码访问)Embedded Resource用流访问,灵活
大图标(AppIcon.ico)Resource被打包并自动识别

🧠 小技巧

  • 项目打包路径推荐:

    1
    2
    
    /Assets/Icons/
    /Assets/Images/
    

    并将这些文件设置为 Resource

  • 快速判断是否打包: 在输出目录看不到图片 → 多半是 Resource。 能看到图片 → 多半是 Content。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计