Disegnare un pennello Hatch da 2px in WPF
Domanda
Sto cercando di creare un DrawingBrush WPF che disegnerà un modello di tratteggio utilizzando due rettangoli da 1px per 1px.Il modello risultante assomiglierebbe allo sfondo delle classiche app Macintosh.
Ecco con cosa sto lavorando:
<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>
Tutto sembra chiaro e nitido, tranne che le scatole sono troppo grandi.Mentre regolo la finestra sul pennello, le cose iniziano a diventare sfocate.Sembra che l'anti-aliasing sia ciò che mi sta uccidendo;vuole usare 3px per sfumare dal verde fisso al nulla, il che non funziona quando arrivo a dimensioni inferiori a 3-4px.C'è qualcosa che posso fare per disabilitare completamente l'anti-aliasing e disegnare con precisione al pixel?
Soluzione
Compensa il disegno con 0,5 px e eliminerai l'effetto antialiasing.Ciò accade perché il disegno viene eseguito sul bordo dell'offset pixel, anziché sull'offset pixel effettivo specificato.Compensando X,Y con mezzo pixel, dici al motore di disegno di disegnare sul pixel stesso, eliminando la necessità di antialiasing.
Per qualche motivo però questo non funziona con i gradientbrushes.
Questo comportamento è simile a quello che hai nel disegno Quarts su Mac.
Nota:Suo non la finestra di cui dovresti eseguire l'offset, ma la forma effettiva che stai disegnando quando usi il pennello specificato.
Per una risposta più completa, per favore leggi questo articolo.