我正在使用 WPF Grid 来对齐对象,但遇到了一个关于列像素对齐的相当明显的问题。我尝试删除尽可能多的变量,并设法在此代码中显示问题:
<Window x:Class="Test.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100.5" />
<ColumnDefinition Width="199.5" />
</Grid.ColumnDefinitions>
<Border Background="Red">
<Grid.Column>1</Grid.Column>
</Border>
<Border Background="Red">
</Border>
</Grid>
</Window>
如果您运行该示例,很容易看出两列之间的边界存在问题。我相信这是造成的,因为 WPF 只是将一列与背景和另一列与结果进行 alpha 混合,即使从概念上讲,两列都在同一个 Z 中,所以像素应该是它们的权重和的总和的混合背景。
我知道这是一个有问题的问题,我自然不会故意创建具有部分像素大小的列,但是在使用星号大小(我确实经常使用)时可以很容易地观察到相同的效果。
可以通过使用 SnapsToDevicePixels 属性(<Grid SnapsToDevicePixels="True">
而不是<Grid>
)来解决此问题。这是有效的,因为 WPF 具有内部一致的舍入,因此两列都捕捉到相同的像素。但是,我遇到了一个与静脉非常相似的相关问题,但我找不到解决方案。
出于某种原因,在使用 Geometry 类时,我遇到了同样的像素对齐问题,而这次我没有找到任何解决方法。就好像像素是四舍五入的,但现在几何图形被截断一个像素,留下一个 1 像素宽的洞。
示例代码:
<Window x:Class="Test.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid SnapsToDevicePixels="False">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100.5" />
<ColumnDefinition Width="199.5" />
</Grid.ColumnDefinitions>
<Border Background="Red">
<Grid.Column>1</Grid.Column>
</Border>
<Border>
<Border.Background>
<DrawingBrush>
<DrawingBrush.Drawing>
<GeometryDrawing Brush="Red">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0,0,1,1"></RectangleGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Border.Background>
</Border>
</Grid>
</Window>
知道如何让我的像素正确对齐吗?
编辑:
根据答案添加 GuidelineSet 后现在可以正常工作。工作图代码为:
<DrawingGroup>
<DrawingGroup.GuidelineSet>
<GuidelineSet GuidelinesX="0,1" GuidelinesY="0,1"></GuidelineSet>
</DrawingGroup.GuidelineSet>
<GeometryDrawing Brush="Red">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0,0,1,1"></RectangleGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>