it-swarm.com.ru

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

Я пришел в основном из Интернета и немного из Windows Forms. Для нового проекта мы будем использовать WPF. Приложению WPF понадобится от 10 до 20 маленьких иконок и изображений для иллюстративных целей. Я думаю о том, чтобы хранить их в Ассамблее как встроенные ресурсы. Это правильный путь?

Как указать в XAML, что элемент управления Image должен загружать изображение из встроенного ресурса?

383
driis

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

Для этого создайте в качестве ресурса BitmapSource :

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

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

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

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

454
Drew Noakes

Я обнаружил, что наилучшей практикой использования изображений, видео и т.д. Является:

  • Измените ваши файлы "Build action" на "Content". Не забудьте проверить Скопировать в каталог для сборки .
    • Находится в меню "Правый клик" в окне обозревателя решений.
  • Источник изображения в следующем формате:
    • "/ "YourAssemblyName" компонент /"YourPath"/ "YourImage.png" "

Пример

<Image Source="/WPFApplication;component/Images/Start.png" />

Выгоды:

  • Файлы не встраиваются в сборку.
    • Диспетчер ресурсов вызовет некоторые проблемы переполнения памяти при слишком большом количестве ресурсов (во время сборки).
  • Можно вызывать между сборками.
162
Nuno Rodrigues

Некоторые люди спрашивают об этом в коде и не получают ответа.

Потратив много часов на поиски, я нашел очень простой метод, я не нашел ни одного примера, и поэтому я поделился здесь своим, который работает с изображениями. (мой был .gif)

Резюме:

Он возвращает BitmapFrame, который, по-видимому, нравится "получателям" ImageSource.

Использование:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

Метод:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

Усвоение:

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

Я надеюсь, что это спасет вас от многих часов, которые я хотел бы получить для меня!

44
Craig

В коде для загрузки ресурса в исполняющую сборку, где мое изображение Freq.png было в папке Icons и определено как Resource:

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

Я также сделал функцию:

/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="Assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling Assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
    if (Assembly == null)
    {
        Assembly = Assembly.GetCallingAssembly();
    }

    if (pathInApplication[0] == '/')
    {
        pathInApplication = pathInApplication.Substring(1);
    }
    return new BitmapImage(new Uri(@"pack://application:,,,/" + Assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); 
}

Использование (при условии, что вы поместили функцию в класс ResourceHelper):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

Примечание : см. RI пакета MSDN в WPF :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

39
Eric Ouellet

Да, это правильный путь.

Вы можете использовать изображение в файле ресурсов, просто используя путь:

<Image Source="..\Media\Image.png" />

Вы должны установить действие сборки файла образа на "Ресурс".

36
ema

Полное описание того, как использовать ресурсы: ресурс, содержимое и файлы приложений WPF

И как ссылаться на них, читайте "Упаковать URI в WPF".

Короче говоря, есть даже средства для ссылки на ресурсы из ссылочных/ссылающихся сборок.

13
techfan
  1. Visual Studio 2010 Professional SP1.
  2. .NET Framework 4 Профиль клиента.
  3. Изображение PNG добавлено в качестве ресурса в свойствах проекта.
  4. Новый файл в папке "Ресурсы" создается автоматически.
  5. Создайте действие для ресурса.

Это сработало для меня:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
4
JoanComasFdz

Да, это правильный путь. Вы можете использовать изображения в файле ресурсов, используя путь:

<StackPanel Orientation="Horizontal">
    <CheckBox  Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
    <Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
    <TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>
3
Sanjay Ranavaya

Если вы используете Blend , чтобы сделать его более легким и не иметь проблем с получением правильного пути для атрибута Source Просто перетащите изображение с панели "Проект" на дизайнер.

3
user42467