在WPF中使用EdgeMode.Aliased选项时,会出现额外的行

时间:2014-03-20 16:33:31

标签: c# wpf

我今天使用WPF遇到了一个非常奇怪的问题。这是我用来绘制10000 LineGeometry个对象的代码。

// Draw 10000 lines
var g = new GeometryGroup();
var x = 0;
var y = 0;
var n = 1;
while (n < 10000)
{
    x = x + 20;
    if (x > 600)
    {
        x = 0;
        y = y + 20;
    }
    var l = new LineGeometry
    {
        StartPoint = new Point(x, y),
        EndPoint = new Point(x, y + 15)
    };
    g.Children.Add(l);
    n++;
}

var drawing = new GeometryDrawing {Geometry = g};
var drawingGroup = new DrawingGroup();
drawingGroup.Children.Add(drawing);
var myPen = new Pen {Thickness = 1, Brush = Brushes.Yellow};
drawing.Pen = myPen;

var myImage = new Image {Stretch = Stretch.None, Margin = new Thickness(10)};
var myDrawingImage = new DrawingImage {Drawing = drawingGroup};

myImage.Source = myDrawingImage;
canvas.Children.Add(myImage);

Before EdgeMode.Aliased

现在您可以看到结果并不清晰,我使用下面的代码来获得更好的结果。

RenderOptions.SetEdgeMode(myImage, EdgeMode.Aliased);

图像变得清晰但有另一种副作用,如下图所示。

  1. 现在显示了一些行。
  2. 显示了一些额外的奇数行。
  3. After EdgeMode.Aliased

    我已经包含了完整的代码,因此您可以自己试验一下。

    注意: 我在Canvas画布周围使用ZoomBorder类。 Pan & Zoom Image

2 个答案:

答案 0 :(得分:1)

这不是一个真正的答案,但我想在WPF的奇怪行为中添加一些内容,希望有人能够提出真正的解释。

我从(0,0) - (20000,20000)添加了一行。创建8000行对象(n <8000)产生如下预期结果:

enter image description here

现在,创建9000个行对象会让它变得混乱,但请亲自看看: enter image description here

没有设置EdgeMode.Aliased它看起来很好,即使对象数量很多。

答案 1 :(得分:1)

您是否尝试过使用

RenderOptions.SetBitmapScalingMode(myImage, BitmapScalingMode.HighQuality);

代替?

您也可以在Canvas控件上进行设置..

<Canvas RenderOptions.BitmapScalingMode="HighQuality"> ...