情况看起来是这样的:
- 我在应用程序中有很多图标,它们的大小不一。
例如,我使用图标作为 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 图像,它们会改变大小(取决于它们有多少空间)吗?
最佳答案
是的,可以将 .ico 文件添加为 DynamicResource
(当然,因为它是资源,所以它必须有一个 x:Key
)。
但是,它们不会自动改变大小。每个尺寸都可以像这样从 .ico 中提取,其中我为每个图标的框架制作一个 Image
设置为框架的确切尺寸,然后添加那个 Image
到名为 imageStack
的 StackPanel
:
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
,并使用'MyIcon16'
、'MyIcon32' 等键将它们添加到
,等等。ResourceDictionary
- 创建一个
MarkupExtension
或IValueConverter
以提取符合特定条件(例如索引或大小)的框架。 - 由于您使用的是
DynamicResource
,因此您可以随时更改与特定资源键相关联的框架。 - 您可以按范围控制它。您可以将 32x32 帧作为
Window
的ResourceDictionary
键'MyIcon'
中的资源,并将 64x64 帧作为在不同范围内具有相同键的资源,例如Window
中的Grid
。Grid
中使用{DynamicResource MyIcon}
的任何内容都将显示 64x64 帧,而窗口中的其他所有内容均显示 32x32 帧。
关于wpf - .ico 中的图像作为 DynamicResource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6268052/