سؤال

لدي رسومات مصنوعة ديناميكيا مع كائن polyline. إنه ينتج شيئا مثيرا للاهتمام ولكن أود أن أبقى آخر 10 إحداثيات، وبمجرد الوصول إلى المركز العاشر، سيتحرك كل تنسيق إلى اليسار من قبل X بكسل، وسيتم إضافة القيمة الجديدة في النهاية.

في وظيفة إضافة فئة الرسم التي جربتها هذا النوع من التعليمات البرمجية:

        if (points.Count > 10)
        {
            myPolyline.Points.RemoveAt(0);

            foreach(Point p in myPolyline.Points)
            {
                p.X = p.X - 50;//Move all coord back to have a place for the new one
            }   
        }

لا يعمل هذا لأنه لا يمكننا تعديل متغير من المجموعة في حلقة Foreach. ما هي أفضل طريقة للقيام بذلك في WPF / C #؟

مزيد من المعلومات

يمكنني أن أفعل ذلك عن طريق القيام بذلك:

            for (int i = 0; i < this.myPolyline.Points.Count; i++)
            {
                this.myPolyline.Points[i] = new Point(this.myPolyline.Points[i].X - 50, this.myPolyline.Points[i].Y);
            }

ولكن أود أن أفعل طريقة نظافة للقيام بذلك دون الحاجة إلى إنشاء كائن نقطة جدا.

هل كانت مفيدة؟

المحلول

حسنا، Point هو بنية، لذلك لا ينبغي أن تكون العلامة العامة لإنشاء منها جديدة سيئة. القيام بما يلي ...

Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;

... لن يكون حقا لا يختلف، ببساطة لأن الهياكل يتم تمريرها حسب القيمة.

أنت عالق إلى حد كبير مع for حلقة وتعيينها myPolyline.Points[i], ، بالنظر إلى الظروف:

  1. عليك تعديل Point مع اختلاف X القيمة.
  2. لا يمكنك تعديل متغير foreach حلقة، لذلك عليك استخدام for حلقه.
  3. myPolyline.Points[i].X -= 50 لن تعمل بسبب طريقة Point يتم استرداد الصياغة من الصفيف ثم لا إعادة تعيينها تلقائيا.

إذا كنت تريد ببساطة تحريك الكل PolyLine, ، ربما اقترح LayoutTransform أو RenderTransform, ، لكنك تتحرك مجموعة فرعية من PointS وبعد ذلك سوف تضيف الآخرين.

يحرر: إذا كنت ترغب حقا في إعادة تكوين هذه العملية، فيمكنك إنشاء طريقة تمديد PointCollection ل for حلقة ونقطة التغيير والتبديل مثل هذا:

static public void ChangePoints( this PointCollection pc, Vector v ) {
    for (int i = 0; i < pc.Count; i++ ) {
        pc[i] += v;
        // the above works on the indexer because you're doing an operation on the
        // Point rather than on one of the Point's members.
    }
}

الاستعمال:

myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );

لا يزال يتعين عليك تغيير PointS بنفس الطريقة، لكنها تعد في أماكن أخرى حتى يكون الاستخدام أكثر قابلية للقراءة. واستخدام Vector يجعلها أكثر قابلية للقراءة أيضا.

نصائح أخرى

انقل اليسار إلى اليسار بالكامل وزيادة نقطة الإخراج للنقاط الجديدة طوال الوقت.

إذا كان لديك الكثير من العناصر، فسيؤدي ذلك أيضا إلى تحسين أداء التقديم (خاصة إذا قمت بتحريك الحركة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top