按钮模板无法清晰呈现图像

时间:2009-12-14 11:40:43

标签: wpf image blurry

这是我的按钮模板

<Microsoft_Windows_Themes:ButtonChrome 
   x:Name="Chrome" 
   Background="{TemplateBinding Background}" 
   BorderBrush="{TemplateBinding BorderBrush}" 
   RenderDefaulted="{TemplateBinding IsDefaulted}" 
   RenderMouseOver="{TemplateBinding IsMouseOver}" 
   RenderPressed="{TemplateBinding IsPressed}">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Image 
               Source="{TemplateBinding ImageSource}" 

               RenderOptions.BitmapScalingMode="NearestNeighbor"

               SnapsToDevicePixels="True"

               HorizontalAlignment="Center"
               VerticalAlignment="Center"
              Stretch="None"
               />
        <ContentPresenter 
            Grid.Column="1"
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
            Margin="{TemplateBinding Padding}" 
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
            RecognizesAccessKey="True"/>
    </Grid>
</Microsoft_Windows_Themes:ButtonChrome>

现在你可以看到这个问题My Images are blurry on StackOverflow我试过了..

RenderOptions.BitmapScalingMode="NearestNeighbor"

在所有级别,网格,chrome ..并尝试了SnapsToDevicePixels的各种组合,但图像不会正确显示。我设置Stretch = None,图像在中心对齐,还为什么它会自动拉伸?

这是输出,非常令人沮丧。

Bad Image on WPF http://akashkava.com/blog/wp-content/uploads/2009/12/BadButton.PNG

图像的实际尺寸是16x16,但我通过使用Windows Maginifier计算出来,无论我做什么,图像实际上都尝试渲染为20x20,对于更大的图像,它甚至裁剪最右边和底部。我认为当Stretch = None时,图像应该正确渲染16x16,有人能澄清这里的问题吗?

5 个答案:

答案 0 :(得分:1)

尝试在图像元素上设置明确的宽度和高度。

答案 1 :(得分:1)

这是一个已知的wpf问题,微软尚未修复。唯一的解决方法是调整大小,使其不会以像素部分的大小结束。

答案 2 :(得分:1)

调整图像大小即可。

答案 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

答案 4 :(得分:1)

如果您认为您的图像是16x16,但WPF似乎认为它是20x20,那么您可能在图像中遇到了DPI问题。你的形象是PNG吗?将其另存为jpg,看看它看起来如何。

参考:http://www.hanselman.com/blog/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWeirdOrAreBlurry.aspx