3

状況は次のようになります。

  • アプリケーションには多くのアイコンがあり、それらはいくつかの異なるサイズで使用されています。
  • たとえば、次のようにアイコンを DynamicResource として使用します。

    <igRibbon:MenuTool (...) LargeImage="{DynamicResource IconAdd}" />

    <s:Item (...) Icon="{DynamicResource IconAdd}"/>

  • 一部のアイコンは .xaml 形式で、一部は .png 形式です

  • たとえば、次のような新しいアイコンを追加します。 <BitmapImage x:Key="IconAdd" UriSource="../Icons/IconAdd.png" />

問題:
DynamicResource として使用できる .ico 形式のアイコンが必要です。

.ico の画像が必要です。このファイル形式では、1 つのファイルにいくつかの異なる画像サイズを含めることができるからです。.xaml のアイコンは完全にサイズ変更可能ですが、読み込みに時間がかかりました (本当にたくさんのアイコンがあるためです!)。

.icoファイルをそのままDynamicResource追加x:keyして追加することはできますか?
これらの .ico 画像を何らかの方法で追加しても、サイズは変わりますか (場所の量によって異なります)。

4

1 に答える 1

3

はい、.ico ファイルを として追加できますDynamicResource(もちろん、これはリソースなので、.ico ファイルが必要x:Keyです)。

ただし、サイズは自動的に変更されません。各サイズは、次のように .ico から抽出できます。ここでImageは、フレームの正確なサイズに設定されたアイコンのフレームごとに for を作成し、それを呼び出され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'
  • MarkupExtensionまたはを作成して、IValueConverterインデックスやサイズなどの特定の条件に一致するフレームを抽出します。
  • を使用しているDynamicResourceため、特定のリソース キーに関連付けるフレームをいつでも変更できます。
  • スコープで制御できます。Windowのリソースとして 32x32 フレームをResourceDictionaryキー'MyIcon'で保持し、64x64 フレームをリソースとして同じキーを別のスコープ (そのGrid内の など) で保持することができWindowます。で使用{DynamicResource MyIcon}するGridものはすべて 64x64 フレームを表示し、ウィンドウ内の他のすべてのものは 32x32 フレームを表示します。
于 2011-06-07T17:47:59.753 に答える