Подтвердить что ты не робот

Как вы выбираете значок правильного размера из файла .ico в формате с несколькими разрешениями в WPF?

Если у меня есть файл значков с несколькими разрешениями (.ico), как я могу застраховать, чтобы WPF выбрал нужный размер? Устанавливает ли значение ширины и высоты изображения, или WPF просто изменяет размер первого значка в файле ico?

Это то, что я использую в настоящее время (он работает, но я бы хотел избежать изменения размера, если это произойдет).

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

Я хотел бы объявить это в Xaml, если это возможно, без необходимости его кодирования.

4b9b3361

Ответ 1

Для этого я использую простое расширение разметки:

/// <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}" />

Ответ 2

Он не представляется возможным с использованием только Xaml.

Ответ 3

Если причина, о которой вы просите, заключается в том, что значок выглядит размытым для вас, посмотрите эту очень хорошую статью по этой теме, которую я использовал для решения этой проблемы: http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

Вам нужно будет использовать настраиваемый элемент управления, который не только точно определяет размер значка, но гарантирует, что он точно совпадает с сеткой пикселей. Только тогда вы избежите интерполяции и, следовательно, размытости.

Попытка найти некоторую информацию по вашему запросу о выборе размера изображения в значках... отправит обратно, если найду какой-нибудь...