C# SnapsToDevicePixels不';你不能处理图像吗?

C# SnapsToDevicePixels不';你不能处理图像吗?,c#,wpf,bitmap,C#,Wpf,Bitmap,我在WPF中遇到位图图像问题。当图像容器从非整数的位置开始时,图像似乎不符合SnapsToDevicePixels的值 示例代码: <Window x:Class="BlurryImage.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

我在WPF中遇到位图图像问题。当图像容器从非整数的位置开始时,图像似乎不符合
SnapsToDevicePixels
的值

示例代码:

<Window x:Class="BlurryImage.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="110" Width="200">
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
        <Button SnapsToDevicePixels="True">
            <Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/>
        </Button>
        <Button SnapsToDevicePixels="True" Margin="10.333333,0,0,0">
            <Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/>
        </Button>
    </StackPanel>
</Window>

(注意左边距的值:10.333333。)

这里的图像
i16.png
是一个简单的16x16位图,分辨率为96 DPI,带有细垂直线:。(我的系统分辨率为96 DPI,Windows XP,.NET 4)

当我运行程序时,第一个图像是清晰的,而第二个图像是模糊的:

不同的来源,包括这里关于stackoverflow的一些,建议了不同的解决方法。(例如,这些帖子:,和。)我尝试了一些变通方法,它们似乎很有效。在主窗口上使用
UseLayoutRounding=“true”
可以使两个图像都清晰。在图像上使用
RenderOptions.BitmapScalingMode=“NearestNeighbork”
也会使图像变得清晰

问题是,为什么没有解决办法,
SnapsToDevicePixels=“True”
就不能工作?这是WPF中的错误还是我用错了它?

由此:

SnapsToDevicePixels

WPF预计,在某些情况下,人们希望保持一致 用像素网格代替亚像素精度。你可以设置 任何UIElement上的SnapsToDevicePixels属性。这将导致我们 尝试渲染到像素网格,但有相当多的情况 这不起作用-包括图像。我们将寻求改进 这是将来的事


因此,这只是SnapsToDevicePixels功能的一个已知限制。

鉴于模糊图像是
SnapsToDevicePixels
的基本用例之一,我感到遗憾的是,在中没有提到这个错误。@Vlad-是的,不确定为什么它对图像不起作用。除此之外,如果它试图与设备像素对齐,则可能需要在其边界之外进行渲染。看起来从一开始就应该包括UseLayoutRounding。