عنصر تحكم "LightBox" شبه شفاف في C# يستدعي طريقة الطلاء الخاصة بالوالدين
-
22-08-2019 - |
سؤال
أحاول إنشاء تأثير العلبة الخفيفة ضمن طلبي.ولتحقيق ذلك، لدي UserControl مع لوحة تمثل التراكب شبه الشفاف ولوحة منفصلة تستضيف كل المحتوى الضروري.
عندما أقوم بإظهار UserControl هذا، فإنه غالبًا ما يحاول عرض نفسه 2-3 مرات مما يتسبب في ظهور الخلفية لتصبح أكثر قتامة وأكثر قتامة.فكرت في القيام بما يلي في UserControl
protected override void OnPaint ( PaintEventArgs e )
{
if ( Parent != null )
{
Parent.Refresh();
}
base.OnPaint( e );
}
لسوء الحظ، يبدو أن هذا يتسبب في حدوث تأثير حلقة رهيب حيث يقوم الأصل برسم خطوط حمراء على نفسه ثم يقوم UserControl بإعادة رسم نفسه...فوضوي جدا.هل هناك طريقة لوقف هذا بطريقة أو بأخرى؟ربما عن طريق التقاط صورة لشاشة الطباعة من التطبيق، وعرضها في وحدة تحكم المستخدم مع التراكب الموجود في الأعلى؟
يحرر
لقد لاحظت هذا السؤال على الرغم من أنني آمل ألا أحتاج إلى إنشاء نموذج جديد لكل عرض مبسط أقوم بإنشائه!
المحلول 2
يبدو أن هذا السلوك يرجع إلى أنني كنت أقوم بتحديث منطقة UserControl ضمن وظيفة onPaint على سبيل المثال.
protected override void OnPaint ( PaintEventArgs e )
{
// Update Region here
base.OnPaint( e );
}
يبدو أن هذا تسبب في إبطال عنصر التحكم نفسه وإعادة رسم نفسه للتغلب على هذا الذي استخدمته:
Graphics g = e.Graphics;
g.SetClip( Region, CombineMode.Intersect );
يمكن بعد ذلك استخدام هذا لتخفيف تأثير العرض المبسط غير الشفاف مع السماح للمحتوى برسم نفسه.
نصائح أخرى
كقاعدة عامة، غالبًا ما يكون .Invalidate() أفضل بكثير من .Refresh()، نظرًا لأن .Refresh() يتسبب في إعادة رسم فورية، لذلك إذا قمت باستدعائه مرتين، فسيتم إجراء عمليتي إعادة رسم.لا أعتقد أنه سيساعدك كثيرًا هنا، رغم ذلك.