c# - ресурсы - круглый image wpf




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

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

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


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

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

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

В коде для загрузки ресурса в исполняющей сборке, где мое изображение 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


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

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

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

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


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



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

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;

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

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

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

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

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

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





embedded-resource