Pergunta

Eu estou tentando criar um efeito lightbox dentro do meu aplicativo. Para conseguir isso, eu tenho um UserControl com um painel representando a sobreposição semi-transparente e um painel separado que hospeda todo o conteúdo necessário.

Quando eu mostrar esta UserControl Muitas vezes as tentativas de tornar-se 2-3 vezes fazendo com que o fundo para aparecer para obter mais e mais escuro. Pensei em fazer o seguinte no UserControl

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

    base.OnPaint( e );
} 

infelizmente, isso parece causar um loop-efeito terrível em que os redraws Parent itelf e depois teh redraws UserControl itelf ... muito confuso. Existe uma maneira de alguma forma parar isso? possivelmente tomando uma imagem printscreen da aplicação, mostrando que no controle de usuário com a sobreposição ontop?

Editar

Tenho notado este pergunta embora Im esperando que eu não preciso para criar uma nova forma para cada lightbox eu crio!

Foi útil?

Solução 2

Este comportamento parece ser porque eu estava atualizando Região do UserControl dentro da função OnPaint por exemplo.

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

    base.OnPaint( e );
}

Esta aparentemente causou o controle para si invalidar e re-desenhar a si mesmo para superar este eu usei:

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

Este pode então ser usado para dor sobre o efeito lightbox opaca, enquanto permitindo que o conteúdo de pintar em si.

Outras dicas

Como regra do polegar, .Invalidate () é frequentemente muito melhor do que .Refresh (), uma vez .Refresh () provoca um redesenho imediata, por isso, se você chamá-lo duas vezes, dois redraws estão sendo feitas. Eu não acho que ele vai te ajudar muito aqui, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top