WPF双边框DPI渲染问题

4

环境

Windows 8、VS 2012、.NET 4、WPF、屏幕原生分辨率为1920x1080 @96DPI

XAML

<Border BorderThickness="1" BorderBrush="Red" Width="20" Height="20">
    <Border BorderThickness="1" BorderBrush="Blue" />
</Border>

问题

当 DPI 为 96 时,边框看起来很好,但如果我将 DPI 改为 120,则边框不再完全像素对齐。

我尝试了什么

1)在两个边框上设置以下属性 - RenderOptions.EdgeMode="Aliased" SnapsToDevicePixels="True" UseLayoutRounding="True" - 可以减轻高 DPI 导致的反锯齿和渗透问题,但内部边框似乎通常在右侧和底部有 1px 的间距。

2)以下代码不能解决问题:

<Grid Width="20" Height="20">
    <Border BorderThickness="1" BorderBrush="Red" />
    <Border BorderThickness="1" BorderBrush="Blue" Margin="1" />
</Grid>

3) 使用矩形代替边框也存在同样的问题。

4) 在VirtualBox中运行的Win 7客户机下,问题仍然存在。

5) 编辑 - 现在看起来好一些了,因为没有内部边距,但外部的“边框”厚度为2像素:

<Canvas Width="20" Height="20">
    <Polygon Points="0,0 20,0, 20,20, 0,20" StrokeThickness="1" Stroke="Red" RenderOptions.EdgeMode="Aliased" SnapsToDevicePixels="True" UseLayoutRounding="True" />
    <Polygon Points="1,1 19,1, 19,19, 1,19" StrokeThickness="1" Stroke="Blue" RenderOptions.EdgeMode="Aliased" SnapsToDevicePixels="True" UseLayoutRounding="True" />
</Canvas>

问题

如何使边框完美地呈现像素,没有任何内部间距或抗锯齿/出血?

当 DPI 不是 96 时,我无法使用代码后台重新调整边框大小。我必须仅使用 XAML,因为我正在尝试创建基于 XAML 的矢量图标。


你尝试过使用相对坐标的画布多边形/路径来完成这个任务吗? - VidasV
@VidasVasiliauskas - 请查看我在第5步(我尝试过的内容)上的编辑。 - Marko
还有一个想法 - Windows 8的缩放可能是个问题,我知道你已经在虚拟机上尝试过了,但我想知道它在虚拟化和本地操作系统中的表现如何。众所周知,Win 8的缩放在某些比例上会导致像素加倍 - 这听起来很可能是你遇到问题的原因。 - VidasV
@VidasVasiliauskas - 在本地Win 7机器上进行验证,所有测试产生的结果与之前完全相同。 - Marko
我已经没有更多的想法了...希望你能解决这个问题并分享解决方案! - VidasV
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接