Desenhando um 2px escotilha escova no WPF
Pergunta
Eu estou tentando construir um WPF DrawingBrush que vai chamar um teste padrão do portal usando dois 1px por 1px retângulos. O padrão resultante seria parecido com o fundo em aplicações clássicas de Macintosh.
Aqui está o que eu estou trabalhando com:
<Canvas SnapsToDevicePixels="True">
<Canvas.Background>
<DrawingBrush x:Name="gridBackgroundBrush"
Viewport="0,0,10,10"
ViewportUnits="Absolute"
TileMode="Tile">
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Geometry="M0,0 L10,0 10,10, 0,10Z" Brush="Green"/>
<GeometryDrawing Geometry="M10,10 L20,10 20,20, 10,20Z" Brush="Green" />
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Canvas.Background>
</Canvas>
Tudo parece clara e nítida, com exceção de que as caixas são demasiado grande. Como eu ajustar o Viewport na escova, as coisas começam a ficar embaçada. Parece que o anti-aliasing é o que está me matando; ele quer usar 3px a desvanecer-se de verde sólido para nada, que não funciona quando eu chegar a tamanhos abaixo 3-4px. Existe algo que eu possa fazer para totalmente desativar o anti-aliasing e fazer o desenho com precisão de pixel?
Solução
Offset o desenho com 0.5px e você vai se livrar do efeito anti-aliasing. Isso acontece porque o desenho é feito na borda do pixel offset, em vez do pixel real deslocamento que você especificou. Por offset'ing X, Y com metade de um pixel, você diz ao motor de desenho para desenhar no próprio pixel, o que elimina a necessidade de antialiasing.
Por alguma razão isso não funciona com gradientbrushes embora.
Este comportamento é semelhante ao que você tem em Quarts desenho no Mac.
Nota:. É de não o visor que você deve compensar, mas a forma real que você está desenhando ao usar o pincel especificado
Para uma resposta mais completa, por favor ler este artigo .