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