我正在尝试在代码中设置 WPF 图像的源。图像作为资源嵌入到项目中。通过查看示例,我提出了以下代码。由于某种原因它不起作用 - 图像不显示。
通过调试我可以看到流包含图像数据。那么有什么问题呢?
Assembly asm = Assembly.GetExecutingAssembly(); Stream iconStream = asm.GetManifestResourceStream("SomeImage.png"); PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); ImageSource iconSource = iconDecoder.Frames[0]; _icon.Source = iconSource;
图标定义如下:<Image x:Name="_icon" Width="16" Height="16" />
<Image x:Name="_icon" Width="16" Height="16" />
在遇到与您相同的问题并阅读后,我发现了解决方案 - Pack URIs。
我在代码中做了以下事情:
Image finalImage = new Image(); finalImage.Width = 80; ... BitmapImage logo = new BitmapImage(); logo.BeginInit(); logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"); logo.EndInit(); ... finalImage.Source = logo;
或者更短,通过使用另一个 BitmapImage 构造函数:
finalImage.Source = new BitmapImage( new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));
URI 分为几部分:
application:///
路径:编译成引用程序集的资源文件的名称。路径必须符合以下格式:AssemblyShortName[;Version][;PublicKey];component/Path
AssemblyShortName[;Version][;PublicKey];component/Path
后面的三个斜杠application:必须用逗号替换:
application:
注意:包 URI 的授权组件是一个嵌入式 URI,它指向一个包,必须符合 RFC 2396。此外,“/”字符必须替换为“,”字符和保留字符,例如“%”和 ”?” 必须逃脱。有关详细信息,请参阅 OPC。
当然,请确保将图像上的构建操作设置为Resource.
Resource