WPF网格像素对齐问题

时间:2009-10-19 16:35:10

标签: wpf grid alignment pixel

我正在使用WPF网格来对齐对象,并且遇到了关于列的像素对齐的相当明显的问题。我尝试删除尽可能多的变量,并设法在此代码中显示问题:

<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简单地将一列与背景混合,另一列与结果混合,即使概念上两列都在同一个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>

1 个答案:

答案 0 :(得分:2)

我相信你必须use a GuidelineSet in the case of a Drawing。关于如何在SDK中应用可用的GuidelineSets here,有一个很好的部分。