عنصر تحكم "LightBox" شبه شفاف في C# يستدعي طريقة الطلاء الخاصة بالوالدين

StackOverflow https://stackoverflow.com/questions/532918

  •  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() يتسبب في إعادة رسم فورية، لذلك إذا قمت باستدعائه مرتين، فسيتم إجراء عمليتي إعادة رسم.لا أعتقد أنه سيساعدك كثيرًا هنا، رغم ذلك.

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