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

我正在寻找一种方法来设置具有以下要求的图像元素的源:

  • 重构图像的名称并
  • 保持透明度
  • 并在我意外地将图像文件从其位置删除时意识到(可能会发生编译错误)。
  • 这是我已经测试过的

    1:在代码隐藏中:

    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));所以我可以随时重构。