我有一个System.Windows.Controls.Canvas,我以编程方式放置一个System.Windows.Shapes.Polygon:
private Canvas mMainCanvas = new Canvas();
private Polygon mHistogram = new Polygon();
稍后,我使用大量事件更新多边形(约1,000,000左右)。我一直试图尽可能快速有效地实现这一目标(自我斗争)。我最近的尝试是将值累积到PointCollection中并定期重新设置Polygon的集合(mHistogram):
int i = 10000;
PointCollection mPc = new PointCollection(256);
double y;
Point p;
private void EventProcessor( int bin ) {
if (0 < i--) {
p = mPc[bin];
y = p.Y + 1;
p.X = p.X;
p.Y = y;
mPc[bin] = p;
if (mMainCanvas.Height < p.Y)
mMainCanvas.Height = p.Y;
}
else {
i = 10000;
mHistogram.Points = new PointCollection( mPc ); /* This works if mPc
is a PointCollection.
It does not work if
mPc is a Point[]
}
}
这似乎工作正常,尽管还不够快。所以,我将mPc的类型从PointCollection更改为一个简单的Points(Point [])数组,希望这会使访问速度更快一些。但是,当我这样做时,我的Polygon(mHistogram)根本无法更新。
这令我感到困惑。我从IEnumerable(mPc)创建一个新的PointCollection,它应该创建一个新的PointCollection,其行为就像任何其他PointCollection一样。使用数组(Point [])创建时,为什么它的行为会有所不同?
感谢。
答案 0 :(得分:1)
您描述的问题似乎不太可能,并且可能与您的代码的另一个问题有关。查看这个简单的测试,您可以验证是否实际创建了相同的集合:
PointCollection collection1 = new PointCollection(new Point[] { new Point(1, 1), new Point(2, 2) });
PointCollection collection2 = new PointCollection(collection1);
for (int i = 0; i < collection2.Count; i++) {
if (collection1[i] != collection2[i])
throw new InvalidOperationException();
}
对于Points属性的赋值,Polygon不关心PointsCollection的创建方式。
这两段代码都会产生相同的结果:
poly.Points = new PointCollection(new Point[] {
new Point(100, 100),
new Point(200, 200)
});
和
var coll = new PointCollection();
coll.Add(new Point(100, 100));
coll.Add(new Point(200, 200));
poly.Points = new PointCollection(coll);
请注意以下内容有所不同:
var collection = new PointCollection(256);
var array = new Point[256];
该集合包含0个项目,但有空间可容纳256个预先分配的项目。该数组包含256个项目,并且只能容纳256个项目。