我有一个需要提供反馈有关内部状态的用户WPF应用程序。 该设计是有三幅图像,称他们为红,黄,绿等。 这些图像之一将在同一时间取决于状态显示。 这里有几点:
- 这三个图像是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); }
}
虽然在WPF项目中的图像资源生成System.Drawing.Bitmap
财产Resources.Designer.cs
,你可以直接创建BitmapImage
从资源。 你只需要设置生成操作的图像文件,以Resource
(而不是默认的None
)。
如果你有一个文件Red.jpg
在Resources
Visual Studio项目的文件夹中,创建一个BitmapImage
会是什么样如下图所示。 它使用WPF包URI 。
var uri = new Uri("pack://application:,,,/Resources/Red.jpg");
var bitmap = new BitmapImage(uri);
如果你有一个Image
宣布某处XAML这样的控制:
<Image x:Name="image"/>
你可以简单地设定Source
图像的属性在你的代码背后的BitmapImage:
image.Source = bitmap;
如果您希望设置的Source
由绑定,您可以创建一个属性string
,返回图像URI属性。 该字符串将自动转换为BitmapImage
通过内置的TypeConverter
在WPF。
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
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;
UPDATE:毕竟,你的图像并不需要在Visual Studio项目资源。 你可以只添加一个项目文件夹,把图像文件到该文件夹,并设置其生成操作Resource
。 例如,如果你调用的文件夹Images
,该URI将pack://application:,,,/Images/Red.jpg
。
文章来源: How do I change an image source dynamically from code-behind in WPF with an image in Properties.Resources?