目前,我在MainWindow.xaml中有这个:
<Image Name="LogoImage" />
这在MainWindow.xaml.cs中:
public ImageSource LogoImageSource { get; set; }
....
var rm = new ResourceManager("Project.Properties.Resources", GetType().Assembly);
var logoBmp = (Bitmap) rm.GetObject("CompanyLogo");
if (logoBmp != null)
{
var hBitmap = logoBmp.GetHbitmap();
ImageSource src =
Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
LogoImageSource = src;
}
var logoBinding = new Binding("LogoImageSource");
logoBinding.Source = this;
LogoImage.SetBinding(System.Windows.Controls.Image.SourceProperty, logoBinding);
我是这样做的,因为我喜欢将图像保存为嵌入式资源,因此用户安装目录中没有一堆随机文件。
但是如何从XAML而不是C#管理图像绑定(最后3行代码)?
或者,如果有人对如何管理图片资源有任何意见,请与我分享。
答案 0 :(得分:5)
在WPF中,您需要使用Resource
的编译操作,而不是Embedded Resource
。然后你可以像你想的那样访问它。
修改强>
如果您 使用嵌入式资源,则可以使用IValueConverter
进行操作。您基本上将代码移动到可重用的类中,但它看起来像这样:
public class ImageLoadingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || !(value is string)) return null;
var rm = new ResourceManager("Project.Properties.Resources", GetType().Assembly);
using (var stream = rm.GetStream((string)value))
{
return BitmapFrame.Create(stream);
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
然后你会这样使用它:
<lcl:ImageLoadingConverter x:Key="imageLoader" />
...
<Image Source="{Binding Source=LogoImage.png, Converter={StaticResource imageLoader}}" />