2009-06-04 89 views
23

如果我有一个多分辨率图标文件(.ico),我如何确保WPF选择合适大小的文件?设置图片的宽度和高度是否强制它,或者WPF是否简单地调整ico文件中的第一个图标?如何从WPF中的多分辨率.ico文件中选择正确尺寸的图标?

这就是我目前使用的(它的工作原理,但我想避免调整大小,如果这是发生了什么)。

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

我想在Xaml中声明它,如果可能的话,而不必为它编写代码。

回答

24

我使用的是简单的标记扩展:

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

我犯了一个错误。你不能在绑定的标记扩展中设置属性(所以不能是) 但是你可以轻松编写类似的转换器,可以用于绑定: Nikolay 2011-08-11 11:55:30

1

如果你问的原因是,该图标看起来模糊给你,检查出我来解决这个问题的主题本很好的文章:http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

你将不得不使用一个自定义的控制不仅确切地确定了图标的大小,还确保它与像素网格完全吻合。只有这样你才能避免插值并因此模糊。

试图找到你有关的图标图像尺寸选择查询一些信息...会后回来,如果我发现任何...

+2

嗯,这是只有在这个意义上,在拍摄时重新调整模糊。我只是很好奇如何从Xaml中的多图像,多分辨率.ico文件中选择正确的图像。 – SergioL 2009-06-05 19:07:10

4

它并不只出现使用XAML成为可能。

+0

这真的很不幸,但感谢残酷的诚实,它比没有答案更好。 – jpierson 2010-05-12 15:10:23

相关问题