2009-06-04 10 views
23

複数解像度のアイコンファイル(.ico)を使用している場合、WPFが正しいサイズのアイコンファイルを選択することをどのようにして保証できますか? Imageの幅と高さを設定すると強制的に動作するのですか、WPFはicoファイルの最初のアイコンのサイズを変更しますか?どのようにWPFのマルチ解像度.icoファイルから適切なサイズのアイコンを選択しますか?

これは私が現在使用しているものです(動作しますが、それが起こっている場合はサイズ変更を避けたいと思います)。

<MenuItem.Icon> 
    <Image Source="MyIcons.ico" Width="16" Height="16" /> 
</MenuItem.Icon> 

可能であれば、これをコードすることなくXamlで宣言したいと思います。

答えて

24

私はそのための簡単なマークアップ拡張機能を使用します。

/// <summary> 
/// Simple extension for icon, to let you choose icon with specific size. 
/// Usage sample: 
/// Image Stretch="None" Source="{common:Icon /Controls;component/icons/custom.ico, 16}" 
/// Or: 
/// Image Source="{common:Icon Source={Binding IconResource}, Size=16}" 
/// </summary> 
public class IconExtension : MarkupExtension 
{ 
    private string _source; 

    public string Source 
    { 
     get 
     { 
      return _source; 
     } 
     set 
     { 
      // Have to make full pack URI from short form, so System.Uri recognizes it. 
      _source = "pack://application:,,," + value; 
     } 
    } 

    public int Size { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var decoder = BitmapDecoder.Create(new Uri(Source), 
              BitmapCreateOptions.DelayCreation, 
              BitmapCacheOption.OnDemand); 

     var result = decoder.Frames.SingleOrDefault(f => f.Width == Size); 
     if (result == default(BitmapFrame)) 
     { 
      result = decoder.Frames.OrderBy(f => f.Width).First(); 
     } 

     return result; 
    } 

    public IconExtension(string source, int size) 
    { 
     Source = source; 
     Size = size; 
    } 

    public IconExtension() { } 
} 

XAMLの使用法:

<Image Stretch="None" 
     Source="{common:Icon Source={Binding IconResource},Size=16}"/> 

または

<Image Stretch="None" 
     Source="{common:Icon /ControlsTester;component/icons/custom-reports.ico, 16}" /> 
+1

私は間違いをします。バインディングを使用してマークアップ拡張でプロパティを設定することはできません(したがって、 Nikolay

+5

私はそれが大好きです。奇妙なWPFの問題...と私は、StackOverflowの質問と答え...エレガントなソリューションを見つける。非常に素晴らしい。 +1 – cplotts

+1

これは、例えば 'ListBox'でいくつかのアイコンを使うときのパフォーマンスに影響しますか?デコードされたアイコンを_cache_にするといいでしょう。したがって、各アイコンのサイズに対して1つのデコードが必要です。 – JobaDiniz

1

あなたが求めている理由は、私はその問題を解決するために使用されるトピックにこの非常に良い記事をチェックアウトし、アイコンがあなたにぼやけて見えることである場合:http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

カスタムコントロールを使用する必要がありますアイコンのサイズを正確に調整するだけでなく、ピクセルグリッドと正確に一致するようにします。それでは、補間とぼやけを避けることができます。私は、任意のを見つけた場合、アイコンの画像サイズ選択についてのお問い合わせにいくつかの情報を検索しようと

...戻って掲載します...

+2

をまあ、それは画像が再スケーリングされたという意味でのみぼやけます。 Xamlのマルチ画像、マルチ解像度の.icoファイルから正しい画像を選ぶ方法は本当に興味があります。 – SergioL

4

唯一のXAMLを使用して可能であることが表示されません。

+0

それは本当に残念なことに、残酷な正直さに感謝しています。答えがないよりも優れています。 – jpierson

関連する問題