2009-06-04 10 views
23

Se si dispone di un file icona a risoluzione multipla (.ico), come posso assicurare che WPF riprenda quello corretto? L'impostazione della larghezza e dell'altezza dell'immagine lo impone o WPF semplicemente ridimensiona la prima icona nel file ico?Come si seleziona l'icona della dimensione giusta da un file .ico a risoluzione multipla in WPF?

Questo è quello che sto usando attualmente (funziona, ma mi piacerebbe evitare il ridimensionamento se questo è ciò che sta accadendo).

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

Vorrei dichiararlo in Xaml se possibile senza doverlo codificare.

risposta

24

Io uso semplice estensione di markup per questo:

/// <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 utilizzo:

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

o

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

Ho fatto un errore. Non puoi impostare la proprietà in Markup Extension con l'associazione (quindi non può essere ) Ma puoi scrivere facilmente un convertitore simile, che può essere utilizzato con il binding: Nikolay

+5

Mi piace quando ho un problema WPF strano ... e trovo una domanda StackOverflow e rispondo ... con una soluzione elegante. Molto bella. +1 – cplotts

+1

Questo ha un impatto sulle prestazioni quando si usano diverse icone su un 'ListBox' per esempio? Sarebbe carino con _cache_ l'icona decodificata, quindi richiede una decodifica per ogni dimensione dell'icona. – JobaDiniz

1

Se il motivo che stai chiedendo è che l'icona appare sfocata a te, controllare questo ottimo articolo sul tema che ho usato per risolvere il problema: http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

Si dovrà utilizzare un controllo personalizzato che non solo dimensiona esattamente l'icona, ma assicura che coincida esattamente con la griglia di pixel. Solo allora eviterete l'interpolazione e quindi la sfocatura.

Cercando di trovare alcune informazioni su vostra domanda circa selezione della dimensione dell'immagine nelle icone ... posterò indietro se trovo qualsiasi ...

+2

bene, è sfocata solo nel senso che l'immagine è stata ridimensionata. Sono solo curioso di sapere come scegliere l'immagine giusta da un file .ico multi-immagine e multi-risoluzione in Xaml. – SergioL

4

Non sembra essere possibile utilizzando solo XAML.

+0

Questo è davvero sfortunatamente, ma grazie per la brutale onestà, è meglio che nessuna risposta. – jpierson

Problemi correlati