C#半透明';灯箱';控件调用父级';s油漆法

C#半透明';灯箱';控件调用父级';s油漆法,c#,user-controls,lightbox,C#,User Controls,Lightbox,我正在尝试在我的应用程序中创建一个。为了实现这一点,我有一个UserControl,其中一个面板表示半透明覆盖,另一个单独的面板承载所有必要的内容 当我显示这个用户控件时,它经常尝试渲染自己2-3次,导致背景看起来越来越暗。我考虑在UserControl中执行以下操作 protected override void OnPaint ( PaintEventArgs e ) { if ( Parent != null ) { Parent.Refresh();

我正在尝试在我的应用程序中创建一个。为了实现这一点,我有一个UserControl,其中一个面板表示半透明覆盖,另一个单独的面板承载所有必要的内容

当我显示这个用户控件时,它经常尝试渲染自己2-3次,导致背景看起来越来越暗。我考虑在UserControl中执行以下操作

protected override void OnPaint ( PaintEventArgs e )
{
    if ( Parent != null )
    {
        Parent.Refresh();
    }

    base.OnPaint( e );
} 
不幸的是,这似乎导致了一个可怕的循环效果,父red绘制itelf,然后UserControl重新绘制itelf。。。很乱。有没有办法阻止这一切?可能通过从应用程序中获取打印屏幕图像,并在用户控件中使用overlay ontop显示该图像

编辑


我注意到了,虽然我希望我不需要为我创建的每个灯箱创建一个新的形式

根据经验,.Invalidate()通常比.Refresh()好得多,因为.Refresh()会立即重画,所以如果调用它两次,就会进行两次重画。不过,我认为这对您没有多大帮助。

根据经验,.Invalidate()通常比.Refresh()好得多,因为.Refresh()会立即重画,所以如果您调用它两次,就会进行两次重画。不过,我认为这对您没有多大帮助。

这种行为似乎是因为我在onPaint函数中更新了UserControl的区域,例如

protected override void OnPaint ( PaintEventArgs e )
{
    // Update Region here

    base.OnPaint( e );
}
这显然导致控件自身失效,并重新绘制自身以克服我使用的问题:

Graphics g = e.Graphics;
g.SetClip( Region, CombineMode.Intersect );

然后,这可以用于在允许内容自行绘制的同时对不透明灯箱效果造成影响。

此行为似乎是因为我在onPaint功能中更新了UserControl的区域,例如

protected override void OnPaint ( PaintEventArgs e )
{
    // Update Region here

    base.OnPaint( e );
}
这显然导致控件自身失效,并重新绘制自身以克服我使用的问题:

Graphics g = e.Graphics;
g.SetClip( Region, CombineMode.Intersect );
然后,可以使用此选项在不透明灯箱效果上进行调整,同时允许内容自行绘制