Как использовать ресурсы.resx для связывания изображений

Я включил файл значков в свои ресурсы.resx, который я хотел бы показать на TreeViewItem, который находится внутри stackpanel.

1)может .ICO файлы будут использоваться для этой цели? Или так и должно быть .bmp или jpg?

2) Что вы устанавливаете в качестве источника в XAML? Следующий код не работал для меня

<StackPanel Orientation="Horizontal">
    <Image Margin="2" Source="/Resources/Folder_Back.ico" />
    <TextBlock Margin="2" Text="{Binding ProgramName}"
     Foreground="White" FontWeight="Bold"/>
</StackPanel>

3 ответов


вы не можете этого сделать. это работало только в WinForms

см. Этот пост для получения дополнительной информации

по-другому, как добавить изображение в ресурсы

используйте метод, показанный в этом сообщении

ресурсы изображений WPF

цитата:

если вы будете использовать изображение в нескольких местах, то стоит загрузить данные изображения только один раз в память, а затем поделиться им между всеми Image элементы.

для этого создано!--30-->BitmapSource как ресурс где-то:

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

затем в вашем коде используйте что-то вроде:

<Image Source="{StaticResource MyImageSource}" />

в моем случае, я обнаружил, что мне пришлось установить Image.png файл, чтобы иметь действие сборки Resource а не просто Content. Это приводит к переносу изображения в скомпилированную сборку.


вот трюк для доступа к изображению в файле ресурсов:

доступ к изображению из файла ресурсов в разметке XAML

сначала вам нужно добавить ссылку на свойства проекта следующим образом:

xmlns:properties="clr-namespace:MyProject.Properties"

а затем получить доступ к нему через XAML следующим образом:

<image source="{Binding Source={x:Static properties:Resources.ImageName}}" />

вы можете использовать PNG/JPG / BMP, а также файл ICO, но все рекомендуют PNG.


чтобы сделать решение работы Qorbani, добавьте конвертер в Источник изображения.Связывание!

в XAML пространства имен

 xmlns:properties="clr-namespace:YourNameSpace.Properties"
 xmlns:converter="clr-namespace:YourNameSpace.Converter"

Xaml-Resource (UserControl или Window)

 <UserControl.Resources>
        <ResourceDictionary>
              <converter:BitmapToImageSourceConverter x:Key="BitmapToImageSourceConverter" />
        </ResourceDictionary>
 </UserControl.Resources>

Код Xaml

<StackPanel Orientation="Horizontal">
                    <Image Width="32" Height="32" Source="{Binding Source={x:Static properties:Resources.Import}, Converter={StaticResource BitmapToImageSourceConverter}}" Stretch="Fill" />
                    <TextBlock Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center">Import</TextBlock>
</StackPanel>

BitmapToImageSourceConverter.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace YourNameSpace
{
    public class BitmapToImageSourceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var bitmap = value as System.Drawing.Bitmap;
            if (bitmap == null)
                throw new ArgumentNullException("bitmap");

            var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

            var bitmapData = bitmap.LockBits(
                rect,
                ImageLockMode.ReadWrite,
                System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            try
            {
                var size = (rect.Width * rect.Height) * 4;

                return BitmapSource.Create(
                    bitmap.Width,
                    bitmap.Height,
                    bitmap.HorizontalResolution,
                    bitmap.VerticalResolution,
                    PixelFormats.Bgra32,
                    null,
                    bitmapData.Scan0,
                    size,
                    bitmapData.Stride);
            }
            finally
            {
                bitmap.UnlockBits(bitmapData);
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}