2009-06-04 3 views
23

Si j'ai un fichier d'icônes multi-résolution (.ico), comment puis-je m'assurer que WPF choisit la bonne taille? Est-ce que le réglage de la largeur et de la hauteur de l'image le force ou est-ce que WPF redimensionne simplement la première icône dans le fichier ico?Comment sélectionner l'icône de bonne taille à partir d'un fichier .ico multi-résolution dans WPF?

C'est ce que j'utilise actuellement (cela fonctionne, mais je voudrais éviter le redimensionnement si c'est ce qui se passe). Je voudrais déclarer ceci dans Xaml si possible sans avoir à coder pour cela.

Répondre

24

J'utilise simple extension de balisage pour que:

/// <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() { } 
} 

utilisation Xaml:

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

ou

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

Je fais une erreur. Vous ne pouvez pas définir la propriété dans l'extension de balisage avec liaison (donc ne peut pas être ) Mais vous pouvez écrire facilement un convertisseur similaire, qui peut être utilisé avec une liaison: Nikolay

+5

Je l'aime quand j'ai un problème WPF impair ... et je trouve une question et une réponse StackOverflow ... avec une solution élégante. Très agréable. +1 – cplotts

+1

Est-ce que cela a un impact sur les performances lorsque vous utilisez plusieurs icônes sur un 'ListBox' par exemple? Serait sympa de _cache_ l'icône décodée, donc cela nécessite un décodage pour chaque taille d'icône. – JobaDiniz

1

Si la raison pour laquelle vous demandez est que l'icône semble floue à vous, consultez ce très bon article sur le sujet que j'utilisé pour résoudre ce problème: http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

Vous devrez utiliser un contrôle personnalisé cela ne fait pas que dimensionner l'icône exactement, mais garantit qu'elle coïncide exactement avec la grille de pixels. C'est seulement alors que vous éviterez l'interpolation et donc le flou.

Essayer de trouver quelques informations sur votre requête sur la sélection de taille de l'image dans les icônes ... affichera de nouveau si je trouve une ...

+2

Eh bien, il est seulement floue dans le sens que l'image a été redimensionnée. Je suis vraiment curieux de savoir comment choisir la bonne image à partir d'un fichier .ico multi-image et multi-résolution dans Xaml. – SergioL

4

Il ne semble pas être possible en utilisant uniquement XAML.

+0

Thats vraiment malheureusement, mais merci pour l'honnêteté brutale, c'est mieux que pas de réponse du tout. – jpierson

Questions connexes