2009-12-01 19 views
8

Si me hacen el siguiente:Rendering líneas nítidas en WPF

<Grid> 
    <Canvas SnapsToDevicePixels="True"> 
    <Path Fill="#FF000000" SnapsToDevicePixels="True" Data="M 0.00,0.00 L 2.50,0.00 0.00,10.00 " /> 
    <Path Fill="#FF260014" SnapsToDevicePixels="True" Data="M 2.50,0.00 L 7.50,0.00 2.50,10.00 0.00,10.00 " /> 
    <Canvas.RenderTransform> 
     <ScaleTransform ScaleX="{Binding ElementName=slider,Path=Value}" ScaleY="{Binding ElementName=slider,Path=Value}" /> 
    </Canvas.RenderTransform> 
    </Canvas> 
    <Slider x:Name="slider" Minimum="0" Maximum="50" Value="30"/> 
</Grid> 

consigo este resultado (Kaxaml):

enter image description here

Aviso de la línea blanca delgada entre las dos formas. Busqué alrededor y descubrí que esto tiene que ver con la alineación de píxeles. Esperaría que la configuración SnapsToDevicePixels="True" fuera suficiente para deshacerse de la línea, ¡pero esto no funciona!

¿Alguna idea de cómo deshacerse de la línea blanca?

Respuesta

11

Intente encenderla borde aliasing con RenderOptions, como esto (ver Propiedades de malla)

<Grid RenderOptions.EdgeMode="Aliased"> 
    <Canvas SnapsToDevicePixels="True"> 
     <Path Fill="#FF000000" SnapsToDevicePixels="True" Data="M 0.00,0.00 L 2.50,0.00 0.00,10.00 " /> 
     <Path Fill="#FF260014" SnapsToDevicePixels="True" Data="M 2.50,0.00 L 7.50,0.00 2.50,10.00 0.00,10.00 " /> 
     <Canvas.RenderTransform> 
      <ScaleTransform ScaleX="{Binding ElementName=slider,Path=Value}" ScaleY="{Binding ElementName=slider,Path=Value}" /> 
     </Canvas.RenderTransform> 
    </Canvas> 

    <Slider x:Name="slider" Minimum="0" Maximum="50" Value="30"/> 
</Grid> 
+0

fresca eso funcionó, muchas gracias! –

4

Recuerde que SnapsToDevicePixels sólo controla que los puntos individuales no se encuentran en valores de píxeles fraccionarios. Para líneas horizontales y verticales, esto se observa más fácilmente. En tu caso, estás viendo un problema completamente diferente. Los bordes de las formas están suavizados y, por lo tanto, combinados con el fondo. Dado que sus formas son exactamente adyacentes a, ambas se mezclarán con el fondo blanco de la ventana. Usted puede intentar poner una forma detrás de la otra en su lugar:

<Canvas> 
     <Path Fill="#FF000000" Data="M 0.00,0.00 L 7.50,0.00 2.50,10.00 0.00,10.00 " /> 
     <Path Fill="#FF260014" Data="M 2.50,0.00 L 7.50,0.00 2.50,10.00 0.00,10.00 " /> 
     <Canvas.RenderTransform> 
      <ScaleTransform ScaleX="{Binding ElementName=slider,Path=Value}" ScaleY="{Binding ElementName=slider,Path=Value}" /> 
     </Canvas.RenderTransform> 
</Canvas> 

las cuales deben emitir correctamente. Verá errores de representación similares en muchos formatos de archivos vectoriales que se representan principalmente en la pantalla, como SVG.

La otra opción sería la de desactivar de suavizado, pero que hará que sus bordes dentado que puede no ser lo que quiere (anti-aliasing desactivado en la mitad superior):

alt text http://hypftier.de/dump/wpf_rendering_shape.png