2010-10-27 151 views
3

下面的代码在画布上绘制两条垂直线。这些线条在屏幕上显示为不同的厚度,尽管它们在代码中是相同的。我正在寻找一种方法让它们看起来像画布边框一样锋利。设置Path.SnapsToDevicePixels没有任何作用。代码是一个人为的例子,一般来说,绘制这些线条的画布可以嵌套在视觉树的更深处。别名问题

感谢您的帮助 康斯坦丁


<Window x:Class="wpfapp.MyWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
    <Border BorderBrush="Black" 
      BorderThickness="1" 
      Margin="10"> 
     <Canvas x:Name="Canvas" 
       SizeChanged="OnCanvasSizeChanged" /> 
    </Border> 
    </Grid> 
</Window> 

using System.Windows; 
using System.Windows.Media; 
using System.Windows.Shapes; 

namespace wpfapp 
{ 
    public partial class MyWindow : Window 
    { 
     public MyWindow() 
     { 
      InitializeComponent(); 
     } 

     private void OnCanvasSizeChanged(object sender, SizeChangedEventArgs e) 
     { 
      StreamGeometry g = new StreamGeometry(); 
      double h = this.Canvas.ActualHeight; 

      using (StreamGeometryContext c = g.Open()) 
      { 
       c.BeginFigure(new Point(7, 0), false, false); 
       c.LineTo(new Point(7, h), true, false); 

       c.BeginFigure(new Point(14, 0), false, false); 
       c.LineTo(new Point(14, h), true, false); 
      } 
      g.Freeze(); 

      Path p = new Path(); 

      p.Data = g; 
      p.SnapsToDevicePixels = true; 
      p.Stroke = new SolidColorBrush(Colors.Black); 
      p.StrokeThickness = 1; 

      this.Canvas.Children.Clear(); 
      this.Canvas.Children.Add(p); 
     } 
    } 
} 
+0

只是一种预感,但尽量在包含画布树中的每个元素上设置SnapsToDevicePixels。如果将矢量转换为渲染流水线上的未对齐坐标,则将单个元素捕捉到设备像素无济于事。 – 2010-10-27 15:08:17

回答

2

需要使用GuidelineSet:


     protected override void OnRender(DrawingContext c) 
     { 
      base.OnRender(c); 

      Pen pen = new Pen(Brushes.Black, 1); 
      double h = this.ActualHeight; 
      double d = pen.Thickness/2; 

      foreach (double x in new double[] { 7, 14 }) 
      { 
       GuidelineSet g = new GuidelineSet(new double[] { x + d }, 
                new double[] { 0 + d, h + d }); 

       c.PushGuidelineSet(g); 
       c.DrawLine(pen, new Point(x, 0), new Point(x, h)); 
       c.Pop(); 
      } 
     }