我试图在代码中设置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" />
下面是一个动态设置映像路径的例子(映像位于磁盘上的某个位置,而不是作为资源构建):
if (File.Exists(imagePath))
{
// Create image element to set as icon on the menu element
Image icon = new Image();
BitmapImage bmImage = new BitmapImage();
bmImage.BeginInit();
bmImage.UriSource = new Uri(imagePath, UriKind.Absolute);
bmImage.EndInit();
icon.Source = bmImage;
icon.MaxWidth = 25;
item.Icon = icon;
}
关于图标的思考……
首先,您可能认为Icon属性只能包含图像。但它实际上可以包含任何东西!当我试图通过编程方式将Image属性直接设置为包含图像路径的字符串时,我偶然发现了这一点。结果是它没有显示图像,而是显示路径的实际文本!
这导致了一种不必为图标制作图像的替代方案,而是使用带有符号字体的文本来显示简单的“图标”。下面的例子使用了包含“软盘”符号的Wingdings字体。这个符号实际上是字符<,它在XAML中有特殊的含义,所以我们必须使用编码版本<代替。这就像做梦一样!下面将软盘符号显示为菜单项上的图标:
<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
<MenuItem.Icon>
<Label VerticalAlignment="Center" HorizontalAlignment="Center" FontFamily="Wingdings"><</Label>
</MenuItem.Icon>
</MenuItem>
我是WPF的新手,但不熟悉。net。
我花了五个小时尝试在。net 3.5 (Visual Studio 2010)中添加一个PNG文件到“WPF自定义控件库项目”,并将其设置为图像继承控件的背景。
与uri相关的任何东西都不起作用。我无法想象为什么没有方法从资源文件中获取URI,通过智能感知,可能是:
Properties.Resources.ResourceManager.GetURI("my_image");
我已经尝试了很多uri和ResourceManager,以及Assembly的GetManifest方法,但都有异常或NULL值。
在这里我罐的代码,为我工作:
// Convert the image in resources to a Stream
Stream ms = new MemoryStream()
Properties.Resources.MyImage.Save(ms, ImageFormat.Png);
// Create a BitmapImage with the stream.
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = ms;
bitmap.EndInit();
// Set as source
Source = bitmap;