小编典典

在代码中设置 WPF 图像源

all

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


阅读 90

收藏
2022-03-31

共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,它指向一个包,必须符合 RFC 2396。此外,“/”字符必须替换为“,”字符和保留字符,例如“%”和
”?” 必须逃脱。有关详细信息,请参阅 OPC。

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

2022-03-31