情况如下:

  • 我在应用程序中有很多图标,它们以几种不同的尺寸使用。
  • 我将图标用作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添加到名为StackPanelimageStack中:

    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控件的大小或ImageButton或其他任何适当的内容对齐/大小设置属性来调整位图的大小。显示它的控件。

    一些控制添加哪个框架的选项虽然不完整,但可以作为解决方案的思路:
  • 以编程方式将图标拆分为BitmapFrames,然后使用ResourceDictionary'MyIcon16'等键将其添加到'MyIcon32'中。
  • 创建MarkupExtensionIValueConverter以提取与某些条件(例如索引或大小)匹配的帧。
  • 由于您正在使用DynamicResource,因此您可以随时更改与特定资源密钥关联的帧。
  • 您可以通过范围控制它。您可以将32x32帧作为资源并使用Window键作为ResourceDictionary'MyIcon'中的资源,并将64x64帧作为资源在不同范围内具有相同键的资源,例如Grid中的Window。在{DynamicResource MyIcon}中使用Grid的所有内容都会显示64x64帧,而窗口中的所有其他内容都将显示32x32帧。
  • 关于wpf - .ico中的图像作为DynamicResource,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6268052/

    10-10 13:24