Изображения в .ico как DynamicResource - PullRequest
3 голосов
/ 07 июня 2011

Ситуация выглядит так:

  • У меня много значков в приложении, и они используются в нескольких разных размерах.
  • Я использую значки в качестве DynamicResource, например, например:

    <igRibbon:MenuTool (...) LargeImage="{DynamicResource IconAdd}" />

    <s:Item (...) Icon="{DynamicResource IconAdd}"/>

  • Некоторыеиконок в формате .xaml, а некоторые в формате .png

  • Я добавляю новые значки, например, такие: <BitmapImage x:Key="IconAdd" UriSource="../Icons/IconAdd.png" />

Проблема: Я хотел бы иметь значки в формате .ico, которые я могу использовать в качестве DynamicResource.

Я хочу изображения в формате .ico, потому что этот формат файла позволяет иметь несколько разных размеров изображения в одном файле.Иконки в .xaml имеют полный размер, но их загрузка заняла много времени (потому что их у меня действительно много!).

Можно ли добавить файл .ico как DynamicResource и добавить к нему x:key?Даже если я каким-то образом добавлю эти .ico-изображения, они изменят размер (в зависимости от того, сколько места у них есть)?

1 Ответ

3 голосов
/ 07 июня 2011

Да, можно добавить файлы .ico как DynamicResource (и, конечно, поскольку это ресурс, он должен иметь x:Key).

Они не будут автоматически изменять размер, тем не мение.Каждый размер извлекается из .ico, как это, в котором я делаю Image для каждого из кадров значка, установленного на точный размер кадра, а затем добавляю это Image к StackPanel, называемому imageStack:

var iconUri = new URI( "pack://application:,,,/MyIcon.ico", UriKind.RelativeOrAbsolute );
var iconDecoder = new IconBitmapDecoder( iconUri,
    BitmapCreationOptions.None, BitmapCacheOption.Default );

foreach ( var frame in iconDecoder.Frames ) {
    var img = new Image(){
        Height = frame.PixelHeight,
        Width = frame.PixelWidth,
        Source = frame }
    imageStack.Children.Add( img );
}

Когда вы просто используете .ico напрямую, он выберет любой кадр с наибольшим разрешением в пикселях и изменит размер этого растрового изображения в зависимости от размера элемента управления Image или любого выравнивания / размера контента.имеются свойства для вашего Image, Button или другого элемента управления, который их отображает.

Несколько вариантов управления тем, какой кадр добавлен, являются неполными, но могут служить идеями длярешение:

  • Программно разделить значок на BitmapFrames и добавить их к ResourceDictionary с помощью клавиш типа 'MyIcon16', 'MyIcon32' и т. д.
  • СоздатьMarkupExtension или IValueConverter для извлечения кадра, соответствующего определенным критериям, таким как индекс или размер.
  • Поскольку вы используете DynamicResource, вы можете в любой момент изменить, какой кадр связан с конкретным ключом ресурса.,
  • Вы можете контролировать его по объему.Вы можете иметь кадр 32x32 в качестве ресурса в Window ResourceDictionary с ключом 'MyIcon' и иметь кадр 64x64 в качестве ресурса с тем же ключом в другой области видимости, например Grid вэто Window.Все, что использует {DynamicResource MyIcon} в Grid, покажет рамку 64x64, а все остальное в окне покажет рамку 32x32.
...