Да, можно добавить файлы .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.