Comment sélectionner l'icône de la bonne taille à partir d'une résolution multiple.fichier ico dans WPF?

si j'ai un fichier d'icônes à plusieurs résolutions (.ico), Comment puis-je m'assurer que WPF choisisse la bonne taille? Est-ce que le fait de définir la largeur et la hauteur de L'Image la force, ou est-ce que WPF redimensionne simplement la première icône dans le fichier ico?

c'est Ce que j'utilise actuellement (il fonctionne, mais je voudrais éviter le redimensionnement si c'est ce qui se passe).

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

je voudrais déclarer ceci dans Xaml si possible sans avoir à le coder.

25
demandé sur SergioL 2009-06-04 21:44:20

3 réponses

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

Xaml utilisation:

<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}" />
26
répondu Nikolay 2015-11-03 08:32:34

cela ne semble pas possible en utilisant Xaml seulement.

4
répondu SergioL 2009-07-06 20:22:51

si la raison pour laquelle vous demandez est que l'icône vous semble floue, consultez ce très bon article sur le sujet que j'ai 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é qui non seulement mesure l'icône exactement, mais s'assure qu'elle coïncide exactement avec la grille de pixels. Ce n'est qu'alors que vous éviterez l'interpolation et donc le flou.

Essayer de trouver un informations sur votre requête sur la sélection de la taille de l'image dans les icônes...nouveau si j'en trouve pas...

1
répondu PeterAllenWebb 2009-06-04 17:49:26