C # полупрозрачный элемент управления «LightBox», вызывающий метод рисования Parent - PullRequest
2 голосов
/ 10 февраля 2009

Я пытаюсь создать эффект лайтбокса в моем приложении. Для этого у меня есть UserControl с панелью, представляющей полупрозрачный оверлей, и отдельной панелью, на которой размещен весь необходимый контент.

Когда я показываю этот UserControl, он часто пытается сделать себя 2-3 раза, в результате чего фон становится темнее и темнее. Я думал о том, чтобы сделать следующее в UserControl

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

    base.OnPaint( e );
} 

к сожалению, это, кажется, вызывает ужасный эффект петли, в результате чего родительский элемент red-raws сам, а затем UserControl перерисовывает сам себя ... очень грязно. Есть ли способ как-то остановить это? возможно, взяв изображение с экрана для печати из приложения и отобразив его в пользовательском элементе управления с оверлеем?

EDIT

Я заметил этот вопрос , хотя я надеюсь, что мне не нужно создавать новую форму для каждого лайтбокса, который я создаю!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2009

Такое поведение вызвано тем, что я обновлял регион UserControl в функции onPaint, например,

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

    base.OnPaint( e );
}

Это, по-видимому, привело к тому, что элемент управления потерял самообладание и перерисовал себя, чтобы преодолеть то, что я использовал:

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

Затем его можно использовать для нанесения эффекта непрозрачного лайтбокса, одновременно позволяя содержимому окрашиваться.

0 голосов
/ 10 февраля 2009

Как правило, .Invalidate () часто намного лучше, чем .Refresh (), поскольку .Refresh () вызывает немедленную перерисовку, поэтому, если вы вызываете ее дважды, выполняется две перерисовки. Я не думаю, что это поможет вам здесь.

...