3

这是我的按钮模板,

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

现在你可以根据这个问题看到我的图像在我试过的 StackOverflow 上很模糊..

RenderOptions.BitmapScalingMode="NearestNeighbor"

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

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

WPF 上的坏图像 http://akashkava.com/blog/wp-content/uploads/2009/12/BadButton.PNG

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

4

5 回答 5

1

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

于 2009-12-14T15:37:00.723 回答
1

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

于 2009-12-15T18:23:09.833 回答
1

调整图像大小就可以了。

于 2009-12-16T02:01:50.957 回答
1

我创建了一个按钮样式并覆盖了控件模板,为其赋予了自定义高度。

您可能需要考虑尝试 WPF4 中现在可用的新属性。RenderOptions.BitmapScalingMode将其留给HighQuality或只是不声明它。

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

以前仅在 Silverlight 中可用的属性现在已修复所有位图大小问题。:)

请注意 -布局舍入可能对精确布局产生一些影响:

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

  • 物体的放置最多可以移动 1 个像素

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

在这里找到更多信息:http: //blogs.msdn.com/text/archive/2009/08/27/layout-rounding.aspx

于 2010-04-29T06:11:34.940 回答
1

如果您认为您的图像是 16x16,但 WPF 似乎认为它是 20x20,那么您可能在图像本身中遇到了 DPI 问题。你的图片是PNG吗?将其另存为 jpg 并查看其外观。

参考:http ://www.hanselman.com/blog/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWe​​irdOrAreBlurry.aspx

于 2010-04-29T06:21:33.283 回答