WinUI中如何在Xaml里正确使用EmbeddedResource加载图片?
在XAML中用EmbeddedResource加载图片的正确姿势
我搞不懂这段代码为啥跑不起来:
<Image Source="pack://application:,,,/Resources/Steam.png" Width="30"/>
我想用EmbeddedResource管理资源,不想把所有资源都丢到bin文件夹里,有没有人能指导下怎么在XAML里正确用EmbeddedResource?
我试过下面几种写法,全都没效果:
<Image Source="pack://application:,,,/Resources/Steam.png" Width="30"/> <Image Source="/Resources/Steam.png" Width="30"/>
我的项目文件配置是这样的:
<ItemGroup> <EmbeddedResource Include="Resources\Steam.png" /> </ItemGroup>
解决步骤
1. 补全Pack URI的程序集信息
EmbeddedResource的Pack URI必须包含程序集名称,正确格式是:pack://application:,,,/[你的程序集名称];component/[资源相对路径]
比如你的程序集叫WpfDemoApp,那XAML里应该这么写:
<Image Source="pack://application:,,,/WpfDemoApp;component/Resources/Steam.png" Width="30"/>
.Net Core/.Net 5+项目可以简化成:
<Image Source="/WpfDemoApp;component/Resources/Steam.png" Width="30"/>
2. 确认资源的生成操作设置
在Visual Studio里选中Steam.png,打开属性窗口,确保生成操作是Embedded Resource,别选成Resource或者Content了。
3. 检查路径大小写
WPF的Pack URI对大小写敏感,要保证XAML里写的路径和实际文件路径完全一致,比如别把Steam.png写成steam.png。
4. 代码加载的备选方案
如果XAML写法还是有问题,试试后台代码手动加载:
using System.Reflection; using System.Windows.Media.Imaging; // 获取当前程序集 var assembly = Assembly.GetExecutingAssembly(); // 资源名称格式:程序集名.文件夹名.文件名,多层文件夹用点分隔 var resourceName = "WpfDemoApp.Resources.Steam.png"; using (var stream = assembly.GetManifestResourceStream(resourceName)) { var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = stream; bitmap.EndInit(); // 给Image控件赋值 YourImageControl.Source = bitmap; }
内容的提问来源于stack exchange,提问作者RoccoZero
相关产品推荐
相关产品推荐

