3

情况是这样的:

  • 我在应用程序中有很多图标,它们以几种不同的尺寸使用。
  • 例如,我使用图标作为 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 图像,它们会改变大小(取决于它们有多少位置)?

4

1 回答 1

3

是的,可以将 .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'
  • 创建MarkupExtensionIValueConverter提取匹配某些标准(如索引或大小)的框架。
  • 由于您使用的是DynamicResource,因此您可以随时更改与特定资源键关联的帧。
  • 您可以通过范围控制它。您可以将 32x32 帧作为具有key的Window's中的资源,并将 64x64 帧作为在不同范围内具有相同键的资源,例如在 that 中。窗口中使用的任何内容都将显示 64x64 帧,而窗口中的其他所有内容都将显示 32x32 帧。ResourceDictionary'MyIcon'GridWindow{DynamicResource MyIcon}Grid
于 2011-06-07T17:47:59.753 回答