كيفية نقل جميع التنسيق من كائن WPF Polyline؟
سؤال
لدي رسومات مصنوعة ديناميكيا مع كائن 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]
, ، بالنظر إلى الظروف:
- عليك تعديل
Point
مع اختلافX
القيمة. - لا يمكنك تعديل متغير
foreach
حلقة، لذلك عليك استخدامfor
حلقه. myPolyline.Points[i].X -= 50
لن تعمل بسبب طريقةPoint
يتم استرداد الصياغة من الصفيف ثم لا إعادة تعيينها تلقائيا.
إذا كنت تريد ببساطة تحريك الكل PolyLine
, ، ربما اقترح LayoutTransform
أو RenderTransform
, ، لكنك تتحرك مجموعة فرعية من Point
S وبعد ذلك سوف تضيف الآخرين.
يحرر: إذا كنت ترغب حقا في إعادة تكوين هذه العملية، فيمكنك إنشاء طريقة تمديد 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 ) );
لا يزال يتعين عليك تغيير Point
S بنفس الطريقة، لكنها تعد في أماكن أخرى حتى يكون الاستخدام أكثر قابلية للقراءة. واستخدام Vector
يجعلها أكثر قابلية للقراءة أيضا.
نصائح أخرى
انقل اليسار إلى اليسار بالكامل وزيادة نقطة الإخراج للنقاط الجديدة طوال الوقت.
إذا كان لديك الكثير من العناصر، فسيؤدي ذلك أيضا إلى تحسين أداء التقديم (خاصة إذا قمت بتحريك الحركة).