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}" />
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
Mi piace quando ho un problema WPF strano ... e trovo una domanda StackOverflow e rispondo ... con una soluzione elegante. Molto bella. +1 – cplotts
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