在WPF中,创建工具栏按钮以便正确缩放图像的最佳方法是什么?

时间:2009-03-28 06:16:53

标签: wpf visual-studio user-interface icons toolbar

具体来说,我希望使用VS2008ImageLibrary中包含的16 * 16 32位png图像。我尝试手动设置图像的高度和宽度属性,调整边距和填充,调整Stretch和RenderOptions。我创建工具栏按钮的尝试都导致了不正确的缩放(图标模糊),图标上的底行像素被截断,或工具栏按钮尺寸不正确 - 更不用说已经提到的消失图标Here 。有没有人找到最好的方法来制作在WPF中正确显示的标准VisualStudio / WinForms风格的工具栏按钮?

4 个答案:

答案 0 :(得分:3)

首先,将图像分辨率更改为96DPI,这可以使用免费的Paint.net(http://www.getpaint.net)打开文件,从菜单中选择Image-> Canvas Size并将“分辨率”调整为96并保存。

如果这没有帮助,那么您可以使用我在博客中写到的解决方案http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx

答案 1 :(得分:2)

最好的方法是使用矢量图形而不是png。我知道以下不完全是你要求的,但imho没有办法让更好看的图标。它也可以帮助你摆脱边距和填充。 (好吧,如果你想使用你被搞砸的照片)

坏消息是你可能需要重新绘制所有图标。您可以使用MS Expression Blend(它能够将绘制的图像保存为.xaml)来执行此操作,或者您可以使用texteditor自行创建它们。 我更喜欢Border.Background而不是Image.Source来放置图标,这允许我将文本放在图像上。这看起来像那样:

<Window.Resources>
   <ResourceDictionary Source="Resources/Icons.xaml"/>
</Window.Resources>
<!--
...
-->
<Button>
   <Border Background="{StaticResource IconName}" Height="16" Width="16" />
</Button>

答案 2 :(得分:1)

我能想出的最好的解决方法是:

<Image x:Key="TB_NewIcon" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
...
<Button Command="ApplicationCommands.New" Content="{StaticResource TB_NewIcon}" Padding="2,2,2,1"/>

或者说:

<BitmapImage x:Key="TB_NewIcon" UriSource="Toolbar Images\NewDocumentHS.png"/>
...
<Button Command="ApplicationCommands.New" Padding="2,2,2,1">
    <Image Source="{StaticResource TB_NewIcon}" Height="16" Width="16" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
</Button>

对于Button Tag,需要Padding属性以确保图像不会在15像素的高度处截断,并且不会调整按钮的大小以适合图像。或者,我们可以指定Padding =“1”,但是我们必须手动设置Height =“21”和Width =“22”以确保按钮不会调整大小以适合图像
在“图像”选项卡上,需要“高度”和“宽度”以确保图像不会拉伸。需要SnapsToDevicePixels和RenderOptions.BitMapScalingMode以确保没有模糊。我不能保证这对所有决议都能很好地发挥作用。

注意: 对于NewDocumentHS.png图标,导致问题最多的图标,因为它占据了16个像素的高度,您可能需要将填充调整为“1,1,3,2”,以便底部对齐更多与其他图标一起使用。

答案 3 :(得分:1)

您可能需要考虑尝试在 WPF4 中使用新属性。 将RenderOptions.BitmapScalingMode保留为 HighQuality ,或者不要声明它。

在您的根元素(即您的主窗口)上添加以下属性: UseLayoutRounding="True"

以前只在Silverlight中可用的属性现在修复了所有Bitmap大小调整问题。 :)

  

请注意 - 一些效果布局四舍五入   可以有精确的布局:

     
      
  • 元素的宽度和/或高度最多可增大或缩小1个像素

  •   
  • 对象的放置最多可以移动1个像素

  •   
  • 中心元素最多可以垂直或水平偏离中心   1像素

  •   

更多信息,请访问:http://blogs.msdn.com/text/archive/2009/08/27/layout-rounding.aspx