如何在WPF中使用Properties.Resources中的图像从代码隐藏中dynamic更改图像源?

我有一个WPF应用程序需要向用户提供有关内部状态的反馈。 devise有三个图像,称为红色,黄色和绿色。 其中一个图像将根据状态一次显示。 这里有几点:

  • 这三个图像位于代码隐藏的Properties.Resources中
  • 一次只显示一个图像。
  • 状态变化来自代码隐藏进程,而不是来自用户。
  • 我想绑定一个图像控件,以便我可以从代码隐藏中更改图像。

我假设我需要一个图像转换器来将JPG图像更改为图像源,例如:


[ValueConversion(typeof(System.Drawing.Bitmap), typeof(ImageSource))] public class BitmapToImageSourceConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var bmp = value as System.Drawing.Bitmap; if (bmp == null) return null; return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } 

我希望在初始化过程中转换一次图像,并保留一个图像源列表。 我还假设我需要一个依赖属性来绑定控件,但我不知道如何设置这个图像源的列表:


  // Dependancy Property for the North Image public static readonly DependencyProperty NorthImagePathProperty = DependencyProperty.Register( "NorthImagePath", typeof(ImageSource), typeof(MainWindow), new PropertyMetadata("**Don't know what goes here!!!**")); // Property wrapper for the dependancy property public ImageSource NorthImagePath { get { return (ImageSource)GetValue(NorthImagePathProperty); } set { SetValue(NorthImagePathProperty, value); } } 

尽pipeWPF项目中的图像资源在Resources.Designer.cs生成了一个System.Drawing.Bitmap属性,但您可以直接从该资源创build一个BitmapImage 。 您只需要将图像文件的“ 生成操作”设置为“ Resource (而不是默认的“ None )。

如果在Visual Studio项目的Resources文件夹中有一个Red.jpg文件,则创build一个BitmapImage如下所示。 它使用了一个WPF包Uri 。

 var uri = new Uri("pack://application:,,,/Resources/Red.jpg"); var bitmap = new BitmapImage(uri); 

如果你有一个在XAML中声明的Image控件,像这样:

 <Image x:Name="image"/> 

您可以简单地将图像的Source属性设置为代码背后的BitmapImage:

 image.Source = bitmap; 

如果你喜欢通过绑定来设置Source属性,你可以创build一个返回图片URI的string属性。 该string将通过WPF中的内置TypeConverter自动转换为BitmapImage

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = this; ImageUri = "pack://application:,,,/Resources/Red.jpg"; } public static readonly DependencyProperty ImageUriProperty = DependencyProperty.Register("ImageUri", typeof(string), typeof(MainWindow)); public string ImageUri { get { return (string)GetValue(ImageUriProperty); } set { SetValue(ImageUriProperty, value); } } } 

在XAML中,你可以像这样绑定属性:

 <Image Source="{Binding ImageUri}"/> 

当然你也可以声明这个属性是ImageSource的types

 public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("Image", typeof(ImageSource), typeof(MainWindow)); public ImageSource Image { get { return (ImageSource)GetValue(ImageProperty); } set { SetValue(ImageProperty, value); } } 

并以同样的方式绑定:

 <Image Source="{Binding Image}"/> 

现在,您可以预先加载图像,并根据需要将它们放入属性中:

 private ImageSource imageRed = new BitmapImage(new Uri("pack://application:,,,/Resources/Red.jpg")); private ImageSource imageBlue = new BitmapImage(new Uri("pack://application:,,,/Resources/Blue.jpg")); ... Image = imageBlue; 

更新:毕竟,您的图像不需要在Visual Studio项目中的资源。 您可以添加一个项目文件夹,将图像文件放入该文件夹并将其“生成操作”设置为“ Resource 。 例如,如果您调用文件夹Images ,URI将是pack://application:,,,/Images/Red.jpg

Interesting Posts