C # semi-transparente 'LightBox' Controle invocando o método de pintura do pai
-
22-08-2019 - |
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!
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.