В 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. Это вызывает образ в скомпилированной сборки.


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

  • изменить файлы "действие при построении" to "содержание". Обязательно проверьте копировать в каталог сборки.
    • найдено в меню "щелкните правой кнопкой мыши" в окне обозревателя решений.
  • Источник Изображения в следующем формат:
    • "/ "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");

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


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

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

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

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


полное описание использования ресурсов:WPF ресурс приложения, содержимое и файлы данных

и как ссылаться на них, прочитайте "Pack URIs in WPF".

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


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

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

<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;