2011-05-16 65 views
12

我畫一個圖表通過直接調用DrawLineDrawingContext。因爲我想避免任何抗鋸齒功能,我tryed把SnapToDevicePixels =父的UIElement真實的,但我仍然有抗混疊:WPF的DrawingContext似乎忽略SnapToDevicePixels

enter image description here

該項目是一箇舊的OS項目不是爲了寫WPF4,但我將其重定向到Framework4,這也可能是一個問題嗎?

回答

3

SnapsToDevicePixels僅適用於元素邊框。您需要使用DrawingContext使用Guidelines。此外,如果它符合你的要求,你可以指定VisualXSnappingGuidelinesVisualYSnappingGuidelines

+0

你的建議實際工作。爲了生成正確的指導方針,我必須考慮繪製的所有座標,甚至增加一半的筆寬。這產生一個非常混亂的代碼(是一場噩夢寫這樣的東西)是不是有一些捷徑? – 2011-05-16 15:38:56

+0

@Felice Pollano:我什麼都沒發現:(即使框架類使用原始解決方案「新的GuidelineSet-> GuidelineSet.Add-> PushGuidelineSet」。例如,看看TickBar類的OnRender方法。 – 2011-05-17 07:26:57

+0

感謝您的答覆。我正在看結果,不知道它是否帶有別名或別名... – 2011-05-17 07:28:29

10

我發現this link,他們基本上說,你應該設置

ParentUIElement.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); 

它爲我工作,所以它可能是值得一試!

2

GuidelineSet旨在解決您的問題。

@Marat Khasanov推薦您使用GuidelineSet,你回答說,它搞砸了你的代碼。我也遇到了這個問題,所以我寫下面的代碼來解決這個問題,使用非醜陋的代碼。

說明:該方法即使在Viewbox中也能正常工作。

public static class SnapDrawingExtensions 
{ 
    public static void DrawSnappedLinesBetweenPoints(this DrawingContext dc, 
     Pen pen, double lineThickness, params Point[] points) 
    { 
     var guidelineSet = new GuidelineSet(); 
     foreach (var point in points) 
     { 
      guidelineSet.GuidelinesX.Add(point.X); 
      guidelineSet.GuidelinesY.Add(point.Y); 
     } 
     var half = lineThickness/2; 
     points = points.Select(p => new Point(p.X + half, p.Y + half)).ToArray(); 
     dc.PushGuidelineSet(guidelineSet); 
     for (var i = 0; i < points.Length - 1; i = i + 2) 
     { 
      dc.DrawLine(pen, points[i], points[i + 1]); 
     } 
     dc.Pop(); 
    } 
} 

呼叫在OnRender和軋製線指向它的方法。

protected override void OnRender(DrawingContext dc) 
{ 
    // Draw four horizontal lines and one vertical line. 
    // Notice that even the point X or Y is not an integer, the line is still snapped to device. 
    dc.DrawSnappedLinesBetweenPoints(_pen, LineThickness, 
     new Point(0, 0), new Point(320, 0), 
     new Point(0, 40), new Point(320, 40), 
     new Point(0, 80.5), new Point(320, 80.5), 
     new Point(0, 119.7777), new Point(320, 119.7777), 
     new Point(0, 0), new Point(0, 120)); 
} 

下面是渲染結果中視框: snapped result