wpf - .ico 中的图像作为 DynamicResource

标签 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 图像,它们会改变大小(取决于它们有多少空间)吗?

最佳答案

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

但是,它们不会自动改变大小。每个尺寸都可以像这样从 .ico 中提取,其中我为每个图标的框架制作一个 Image 设置为框架的确切尺寸,然后添加那个 Image 到名为 imageStackStackPanel:

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,并使用 'MyIcon16''MyIcon32' 等键将它们添加到 ResourceDictionary ,等等。
  • 创建一个 MarkupExtensionIValueConverter 以提取符合特定条件(例如索引或大小)的框架。
  • 由于您使用的是 DynamicResource,因此您可以随时更改与特定资源键相关联的框架。
  • 您可以按范围控制它。您可以将 32x32 帧作为 WindowResourceDictionary'MyIcon' 中的资源,并将 64x64 帧作为在不同范围内具有相同键的资源,例如 Window 中的 GridGrid 中使用 {DynamicResource MyIcon} 的任何内容都将显示 64x64 帧,而窗口中的其他所有内容均显示 32x32 帧。

关于wpf - .ico 中的图像作为 DynamicResource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6268052/

相关文章:

c# - 将 Button 的可见性绑定(bind)到 ViewModel 中的 bool 值

c# - 如何使用 Xamarin Form 以编程方式在现有网格上添加按钮或标签?

c# - 当弹出窗口打开时,单击 Windows 标题栏的最小化、最大化和关闭按钮不起作用

visual-studio - 部分声明不得在 Xamarin 中指定不同的基类

c# - 显示消息框后如何停止功能

c# - LoadFromContext 发生

c# - 进程未在程序结束时终止

c# - 如何有效地测试 Action 是否装饰有属性(AuthorizeAttribute)?

WPF 相关性与 HTML

asp.net-mvc - SaveChanges() 不保存数据