如何在XAML中设置此图像源?

时间:2010-09-17 19:23:10

标签: c# wpf image data-binding xaml

目前,我在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行代码)?

或者,如果有人对如何管理图片资源有任何意见,请与我分享。

1 个答案:

答案 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}}" />