.ico中的图像为DynamicResource

时间:2011-06-07 15:54:51

标签: wpf xaml c#-4.0 dynamicresource

情况看起来像这样:

  • 我在应用程序中有很多图标,它们的用途很少。
  • 我使用图标作为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 个答案:

答案 0 :(得分:3)

是的,可以将.ico文件添加为DynamicResource(当然,因为它是一种资源,它必须有x:Key)。

然而,它们不会自动改变大小。每个大小都可以从像这样的.ico中提取出来,其中我为每个图标的帧设置Image,设置为帧的确切大小,然后将Image添加到{{1}调用StackPanel

imageStack

当您直接使用.ico时,它将选择具有最大像素分辨率的帧,并根据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 ); } 控件的大小调整该位图的大小,或者为适当的内容对齐/大小调整属性调整大小您的ImageImage或其他正在显示它的控件。

用于控制添加哪些框架不完整的一些选项,但可以作为解决方案的想法:

  • 以编程方式将图标拆分为Button,然后使用BitmapFramesResourceDictionary等密钥将其添加到'MyIcon16'
  • 创建'MyIcon32'MarkupExtension以提取符合某些条件(如索引或尺寸)的框架。
  • 由于您使用的是IValueConverter,因此您可以随时更改与特定资源键关联的帧。
  • 您可以按范围控制它。您可以使用密钥DynamicResource将32x32帧作为Window的{​​{1}}中的资源,并将64x64帧作为具有相同密钥的64x64帧在不同的范围内,例如作为ResourceDictionary内的'MyIcon'。在Grid中使用Window的任何内容都会显示64x64帧,而窗口中的其他内容则显示32x32帧。