2

我正在使用 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>
4

1 回答 1

2

我相信您必须在 Drawing 的情况下使用 GuidelineSet。SDK 中有一个很好的部分介绍了如何应用可用的 GuidelineSet

于 2009-10-19T22:07:27.063 回答