我畫一個圖表通過直接調用DrawLine
在DrawingContext
。因爲我想避免任何抗鋸齒功能,我tryed把SnapToDevicePixels =父的UIElement真實的,但我仍然有抗混疊:WPF的DrawingContext似乎忽略SnapToDevicePixels
該項目是一箇舊的OS項目不是爲了寫WPF4,但我將其重定向到Framework4,這也可能是一個問題嗎?
我畫一個圖表通過直接調用DrawLine
在DrawingContext
。因爲我想避免任何抗鋸齒功能,我tryed把SnapToDevicePixels =父的UIElement真實的,但我仍然有抗混疊:WPF的DrawingContext似乎忽略SnapToDevicePixels
該項目是一箇舊的OS項目不是爲了寫WPF4,但我將其重定向到Framework4,這也可能是一個問題嗎?
SnapsToDevicePixels僅適用於元素邊框。您需要使用DrawingContext使用Guidelines。此外,如果它符合你的要求,你可以指定VisualXSnappingGuidelines和VisualYSnappingGuidelines。
我發現this link,他們基本上說,你應該設置
ParentUIElement.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
它爲我工作,所以它可能是值得一試!
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));
}
你的建議實際工作。爲了生成正確的指導方針,我必須考慮繪製的所有座標,甚至增加一半的筆寬。這產生一個非常混亂的代碼(是一場噩夢寫這樣的東西)是不是有一些捷徑? – 2011-05-16 15:38:56
@Felice Pollano:我什麼都沒發現:(即使框架類使用原始解決方案「新的GuidelineSet-> GuidelineSet.Add-> PushGuidelineSet」。例如,看看TickBar類的OnRender方法。 – 2011-05-17 07:26:57
感謝您的答覆。我正在看結果,不知道它是否帶有別名或別名... – 2011-05-17 07:28:29