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>
そのサンプルを実行すると、2つの列の境界に問題があることが簡単にわかります。これは、概念的には両方の列が同じZにある場合でも、WPFが一方の列を背景と、もう一方の列を結果と単純にアルファブレンドするため、ピクセルはそれらの重みの合計とバックグラウンド。
これは問題のある問題だと理解しています。当然、部分的なピクセルサイズの列を意図的に作成することはありませんが、星のサイズ(私はよく使用します)を使用しても同じ効果を簡単に確認できます。
<Grid SnapsToDevicePixels="True">
この問題は、(の代わりに) SnapsToDevicePixelsプロパティを使用することで回避できます<Grid>
。これは、WPFの丸めが内部的に一貫しているため、両方の列が同じピクセルにスナップするために機能します。しかし、私は静脈に非常に似ている関連する問題にぶつかり、解決策を見つけることができませんでした。
何らかの理由で、Geometryクラスを使用すると、同じ種類のピクセルアライメントの問題が発生しますが、今回は回避策は見つかりませんでした。ピクセルが丸みを帯びているように見えますが、ジオメトリが1ピクセル離れてスナップされ、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>