Ресурсы изображений WPF
Я родом из большей части сети и немного фона Windows Forms. Для нового проекта мы будем использовать WPF. Приложение WPF потребует 10-20 маленьких значков и изображений для иллюстративных целей. Я думаю об их хранении в сборке в виде встроенных ресурсов. Это правильный путь?
Как указать в XAML, что элемент управления Image должен загружать изображение из встроенного ресурса?
Ответы
Ответ 1
Если вы будете использовать изображение в нескольких местах, то стоит загрузить данные изображения только один раз в память, а затем поделиться им между всеми элементами Image
.
Для этого создайте BitmapSource
в качестве ресурса где-нибудь:
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
Затем в вашем коде используйте что-то вроде:
<Image Source="{StaticResource MyImageSource}" />
В моем случае я обнаружил, что мне нужно было установить файл Image.png
для действия сборки Resource
, а не только Content
. Это приводит к тому, что изображение переносится внутри вашей сборной сборки.
Ответ 2
Я считаю, что лучше всего использовать изображения, видео и т.д.:
- Измените свои файлы "Настроить действие" на "Содержимое". Обязательно проверьте Копировать, чтобы создать каталог.
- Найден в меню "Правка" в окне "Обозреватель решений".
- Источник изображения в следующем формате:
- "/"YourAssemblyName";component/"YourPath"/"YourImage.png""
пример
<Image Source="/WPFApplication;component/Images/Start.png" />
Выгоды:
- Файлы не встроены в сборку.
- Диспетчер ресурсов вызовет проблемы с переполнением памяти со слишком большим количеством ресурсов (во время сборки).
- Может быть вызвано между сборками.
Ответ 3
Некоторые люди спрашивают об этом в коде и не получают ответа.
После многочасового поиска я нашел очень простой метод, я не нашел примера, поэтому я поделился с вами здесь
который работает с изображениями. (мой был .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);
}
Усвоение:
Из моего опыта строка пакета не является проблемой, проверьте свои потоки, и особенно если прочесть ее в первый раз, установите указатель
до конца файла, и вам нужно снова установить его на ноль перед чтением снова.
Надеюсь, это сэкономит вам много часов, которые я желаю, чтобы этот кусок был для меня!
Ответ 4
В коде для загрузки ресурса в исполняющей сборке, где мое изображение 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");
Примечание: см. URI MSDN Pack в WPF:
pack://application:,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml
Ответ 5
Да, это правильный путь.
Вы можете использовать изображение в файле ресурсов, просто используя путь:
<Image Source="..\Media\Image.png" />
Вы должны установить действие сборки файла изображения в "Ресурс".
Ответ 6
Полное описание использования ресурсов: ресурсы, содержимое и файлы данных приложения WPF
И как ссылаться на них, прочитайте "URI пакетов в WPF".
Короче говоря, есть даже средства для ссылки на ресурсы из ссылочных/ссылочных сборок.
Ответ 7
- Visual Studio 2010 Professional SP1.
- Профиль клиента .NET Framework 4.
- Изображение PNG добавлено как ресурс в свойствах проекта.
- Создан новый файл в папке Ресурсы.
- Действия сборки, установленные для ресурса.
Это сработало для меня:
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
Ответ 8
Да, это правильный путь. Вы можете использовать изображения в файле ресурсов, используя путь:
<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>
Ответ 9
Если вы используете Blend, чтобы сделать его более легким и не иметь проблем с получением правильного пути для атрибута Source, просто перетащите изображение с панели Project на конструктор.
Ответ 10
Следующие работы и изображения, которые нужно установить, являются ресурсами в свойствах:
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;