.NET PointCollection, созданная с помощью массива, ведет себя не так, как созданная из PointCollection. - PullRequest
1 голос
/ 15 июля 2011

У меня есть 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 на простой массив Point (Point []), надеясь, что это сделает доступ немного быстрее.Однако, когда я делаю это, мой Polygon (mHistogram) вообще не обновляется.

Это сбивает с толку меня.Я создаю новую PointCollection из IEnumerable (mPc), который должен создать новую PointCollection, которая ведет себя так же, как и любая другая PointCollection.Почему он ведет себя по-разному, когда создается с массивом (точка [])?

Спасибо.

1 Ответ

1 голос
/ 15 июля 2011

Проблема, которую вы описываете, кажется маловероятной и, вероятно, связана с другой проблемой вашего кода. Глядя на этот простой тест, вы можете убедиться, что на самом деле созданы одни и те же коллекции:

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, то многоугольнику было бы все равно, как была создана коллекция 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 элементов.

...