Как я могу установить этот источник изображения в XAML? - PullRequest
0 голосов
/ 17 сентября 2010

В настоящее время у меня есть это в 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);

Я делаю это таким образом, потому что мне нравится хранить изображения в качестве встроенных ресурсов, чтобы не было случайных файлов, попадающих в каталог установки пользователя.

Но как мне управлять связыванием изображения (последние 3 строки кода) из XAML, а не из C #?

Или, если у кого-то есть сведения о том, как они управляют ресурсами изображений, поделитесь со мной.

1 Ответ

5 голосов
/ 17 сентября 2010

В 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}}" />
...