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

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

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>

person l46kok    schedule 11.09.2012    source источник


Ответы (5)


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

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

Другой способ добавления изображения к ресурсам

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

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

вместо

цитата:

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

Для этого создайте _2 _ как ресурс где-нибудь:

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

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

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

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

person Nahum    schedule 11.09.2012
comment
Могу ли я использовать файлы .ico в качестве источника изображений? - person l46kok; 11.09.2012
comment
да. просто используйте .ico вместо png. вы даже можете редактировать его внутри VS - person Nahum; 11.09.2012

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

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

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

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

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

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

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

person Qorbani    schedule 11.09.2012
comment
Это не работает. Ничего не появляется. Я пробовал использовать его как для значка, так и для изображения. - person The Muffin Man; 18.02.2015

чтобы решение Qorbani работало, добавьте конвертер в Image Source.Binding!

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

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

Xaml - ресурс (пользовательский элемент управления или окно)

 <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();
        }
    }
}
person WhileTrueSleep    schedule 16.06.2016
comment
Оно работает. Ответ Корбани не работает для имиджа. но после выполнения у меня возникла ошибка. Значение staticExtension не может быть разрешено в перечисление, статическое поле или статическое свойство. Решение: stackoverflow.com/questions/9773610/ - person jijijijiji; 01.06.2018

В принятом ответе говорится, что это невозможно, и рабочее решение преобразует типы GDI + Bitmap в изображения WPF. Но эти преобразования совершенно не нужны. Решение на самом деле очень простое:

  1. Когда вы добавляете файлы изображений или значков в файл ресурсов, дизайнер по умолчанию выбирает для них типы GDI +:

введите описание изображения здесь

  1. Просто откройте файл .resx в редакторе XML (в обозревателе решений щелкните правой кнопкой мыши, Открыть с помощью ...) и измените типы Bitmap и Icon на MemoryStream:
<!--<value>..\Resources\Undo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>-->
<value>..\Resources\Undo.png;System.IO.MemoryStream</value>

...

<!--<value>..\Resources\Error.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>-->
<value>..\Resources\Error.ico;System.IO.MemoryStream</value>

  1. Сохраните файл .resx. Если вы сейчас откроете конструктор, вы сможете найти свои ресурсы в меню Другое.

введите описание изображения здесь

Не пытайтесь «починить» Resources.cs. Когда вы сохраните файл .resx, он будет автоматически восстановлен с правильными типами. Сгенерированный тип возвращаемого значения на самом деле будет UnmanagedMemoryStream, но не беспокойтесь об этом.

  1. Использование:
public static class WpfImages
{
    public static ImageSource Error { get; } = BitmapFrame.Create(Resources.Error);
    // [...]
}
<Image Source="{x:Static local:WpfImages.Error}"/>
person György Kőszeg    schedule 18.07.2019

Сначала: добавьте ресурсы rsx, затем: добавьте изображения как изображения в файл ресурсов и установите действие сборки изображения на ресурс. Теперь вы можете получить доступ к изображениям следующим образом:

<Image Source="pack://application:,,,/Resources/image.png"/>
person Dwight    schedule 25.11.2018