C# 在WPF代码隐藏中将用户资源文件中的透明图像设置为图像源
这个问题已经被问到了不同的版本,但这些问题的解决方案并不符合我的要求 假设我们在名为C# 在WPF代码隐藏中将用户资源文件中的透明图像设置为图像源,c#,wpf,image,xaml,code-behind,C#,Wpf,Image,Xaml,Code Behind,这个问题已经被问到了不同的版本,但这些问题的解决方案并不符合我的要求 假设我们在名为Icons的项目文件夹中有一个名为MyResource.resx的资源文件和一个名为Accept.png的图像文件,并且对该图像的引用位于MyResource.resx中 我正在寻找一种方法来设置具有以下要求的图像元素的源: 重构图像的名称并 保持透明度 并在我意外地将图像文件从其位置删除时意识到(可能会发生编译错误)。 这是我已经测试过的 1:在代码隐藏中: myImage.Source = new Bitma
Icons
的项目文件夹中有一个名为MyResource.resx
的资源文件和一个名为Accept.png
的图像文件,并且对该图像的引用位于MyResource.resx
中
我正在寻找一种方法来设置具有以下要求的图像元素的源:
myImage.Source = new BitmapImage(new Uri(@"\Icons\Accept.png", UriKind.Relative));
myImage.Source = MyResource.Accept.ToBitmapImage()
这段代码的问题是:不可能进行重构,甚至最糟糕的是,与错误uri相关的错误也只发生在运行时
2:同样在代码隐藏中:
myImage.Source = new BitmapImage(new Uri(@"\Icons\Accept.png", UriKind.Relative));
myImage.Source = MyResource.Accept.ToBitmapImage()
其中.ToBitmapImage()
是我在internet上找到的一种方法:
public static BitmapImage ToBitmapImage(this System.Drawing.Bitmap bitmap)
{
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, ImageFormat.Bmp);
memory.Position = 0;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
return bitmapImage;
}
}
此代码的唯一问题是图像透明度丢失
在Xaml中:
<Image x:Name="myImage" Source="/Icons/Accept.png" />
这段代码的问题是:不可能进行重构,并且不会显示与错误uri相关的错误。它们甚至在运行时都不会被注意到
我尝试使用xaml中的资源文件,但失败了
因此,如何做到这一点。由于您用于编码和解码的图像格式,透明度显然会丢失。用
ImageFormat.Png
替换ImageFormat.Bmp
应该可以解决这个问题。或者使用问题答案中提到的其他转换方法之一。除此之外,您通常不会在WPF应用程序中使用.resx
文件。@Clemens感谢您的评论。用ImageFormat.Png替换ImageFormat.Bmp效果很好。但我也希望能在XAML中实现这一点,这样我就可以看到最终的UI。为什么在WPF应用程序中通常不使用.resx文件?我对WPF还是新手。可能会有帮助。@Clemens再次感谢您的宝贵意见。我决定使用uri,而不是简单的字符串,我将使用:var uri=new uri(“pack://application:,,,/Resources/“+nameof(MyResource.Red));所以我可以随时重构。