C#半透明'LightBox'控件调用Parent的paint方法

时间:2009-02-10 16:00:47

标签: c# user-controls lightbox

我正在尝试在我的应用程序中创建lightbox effect。为实现这一目标,我有一个UserControl,其中一个面板代表半透明叠加层,另一个面板托管了所有必要的内容。

当我显示此UserControl时,它经常尝试渲染2-3次,导致背景变得更暗和更暗。我想在UserControl中执行以下操作

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

    base.OnPaint( e );
} 
不幸的是,这似乎会导致一个可怕的循环效应,即父亲红色原始,然后用户控制重新绘制它......非常混乱。有办法以某种方式阻止这种情况吗?可能是通过从应用程序中获取打印屏幕图像,在用户控件中显示覆盖在屏幕上?

修改

我注意到this question虽然我希望我不需要为我创建的每个灯箱创建一个新表单!

2 个答案:

答案 0 :(得分:0)

作为一个经验法则,.Invalidate()通常比.Refresh()好得多,因为.Refresh()会立即重绘,所以如果你调用它两次,就会进行两次重绘。不过,我认为这对你没什么帮助。

答案 1 :(得分:0)

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

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

    base.OnPaint( e );
}

这显然导致控制失效并重新绘制自己以克服我曾经使用过的:

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

这可以用来对不透明灯箱效果造成痛苦,同时允许内容自行绘画。