2012-04-21 8 views
7

Estoy dibujando un gráfico en una aplicación WPF, pero las líneas dibujadas con drawingContext.DrawLine(...) se dibujan en los límites de subpíxeles.Forzar el dibujoLíneas de contexto para ajustar a los límites de píxeles

Soy capaz de hacer que se vean bien creando objetos Line, pero no quiero crear decenas de miles cada vez que se invalide la imagen.

¿Cómo puedo obligarlos a caber en píxeles?

+0

buena pregunta, una pregunta de mi parte, y espero que le he entendido bien, por lo que eligió dibujar un gráfico, hacer todo (cada línea) usted mismo - súper impresionante, mi cabeza está abajo. Ahora lo necesitas? ¿Es posible que use una biblioteca para hacer el trabajo pesado por usted? ... a menos que, por supuesto, esté escribiendo su propio componente de gráficos. –

+0

@denismorozov es mi propio componente de gráficos. Estoy graficando referencias de página de un administrador de memoria simulado para un proyecto escolar. Estamos investigando cómo las operaciones de memoria de diferentes algoritmos pasan por fases y probando diferentes algoritmos de reemplazo de página para minimizar las fallas de página. Es realmente divertido :) –

+0

muy genial! Estoy pensando en jugar con mi propio control de gráficos también. ¡Buena suerte! –

Respuesta

9

Es posible trazar las líneas en un DrawingVisual derivada que tiene la propiedad protegida VisualEdgeMode establecido en EdgeMode.Aliased:

public class MyDrawingVisual : DrawingVisual 
{ 
    public MyDrawingVisual() 
    { 
     VisualEdgeMode = EdgeMode.Aliased; 
    } 
} 

public class DrawingComponent : FrameworkElement 
{ 
    private DrawingVisual visual = new MyDrawingVisual(); 

    public DrawingComponent() 
    { 
     AddVisualChild(visual); 

     using (DrawingContext dc = visual.RenderOpen()) 
     { 
      dc.DrawLine(new Pen(Brushes.Black, 1d), new Point(100, 100), new Point(100, 200)); 
      dc.DrawLine(new Pen(Brushes.Black, 1d), new Point(105.5, 100), new Point(105.5, 200)); 
      dc.DrawLine(new Pen(Brushes.Black, 1d), new Point(112, 100), new Point(112, 200)); 
     } 
    } 

    protected override int VisualChildrenCount 
    { 
     get { return 1; } 
    } 

    protected override Visual GetVisualChild(int index) 
    { 
     return visual; 
    } 
} 

lo suficientemente extraño, pero llamar RenderOptions.SetEdgeMode(visual, EdgeMode.Aliased) en un DrawingVisual no derivada no hacer el trabajo.

Cuestiones relacionadas