一尘不染

在代码中设置WPF图像源

c#

我正在尝试在代码中设置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" />


阅读 235

收藏
2020-05-19

共1个答案

一尘不染

在遇到与您相同的问题并进行了一些阅读之后,我发现了解决方案-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:必须用逗号替换:

注意:包URI的授权组件是指向包的嵌入式URI,并且必须符合RFC2396。此外,“ /”字符必须替换为“,”字符和保留字符(例如“%”)和“?”
必须逃脱。有关详细信息,请参见OPC。

当然,请确保将图像上的构建操作设置为Resource

2020-05-19