2009-05-19 6 views
1

Ich versuche, einen WPF DrawingBrush zu erstellen, der ein Schraffurmuster mit zwei 1px mal 1px Rechtecken zeichnet. Das resultierende Muster würde wie der Hintergrund in klassischen Macintosh-Apps aussehen.Zeichnen eines 2px-Schraffurpinsels in WPF

Hier ist, was ich arbeite mit:

<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> 

Alles sieht klar und scharf, mit der Ausnahme, dass die Boxen sind viel zu groß. Wenn ich den Viewport auf dem Pinsel anpasse, werden die Dinge verschwommen. Es sieht so aus als ob das Anti-Aliasing mich umbringt; es möchte 3px verwenden, um von festem Grün zu nichts zu verblassen, was nicht funktioniert, wenn ich zu Größen unter 3-4px komme. Gibt es etwas, was ich tun kann, um das Anti-Aliasing vollständig zu deaktivieren und pixelgenaues Zeichnen zu machen?

Antwort

1

Versetzen Sie die Zeichnung mit 0.5px und Sie werden den Antialiasing-Effekt loswerden. Dies geschieht, weil das Zeichnen am Rand des Pixel-Offsets und nicht am tatsächlichen Pixel-Offset erfolgt, den Sie angegeben haben. Durch Versetzen von X, Y mit einem halben Pixel, weisen Sie die Zeichnungs-Engine an, auf das Pixel selbst zu zeichnen, was die Notwendigkeit von Antialiasing beseitigt.

Aus irgendeinem Grund funktioniert dies jedoch nicht mit gradientbrushes.

Dieses Verhalten ähnelt dem, was Sie in Quarts Zeichnung auf Mac haben.

Hinweis: Es ist nicht das Ansichtsfenster, das Sie versetzen sollten, aber die tatsächliche Form, die Sie zeichnen, wenn Sie den angegebenen Pinsel verwenden.

Für eine umfassendere Antwort, bitte read this article.