2009-09-25 4 views
2

Поддерживает ли WinForms это? Предположим, я хочу показать панель, содержащую ListView, выполненную из некоторых результатов. Он отображается нажатием кнопки в углу формы, и панель отображается внутри формы, прежде всего элементов управления, предпочтительно с тенью сзади, чтобы сделать ее более привлекательной.Панель управления содержимым в форме

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

Возможно, есть какой-то другой способ, который мне не хватает?

ответ

4

Вот грубый метод, который поможет вам начать работу:

public Panel CreateFloatingPanel(Panel originalPanel) 
{ 
    Bitmap bmp = new Bitmap(originalPanel.Width, 
     originalPanel.Height); 
    Rectangle rect = new Rectangle(0, 0, 
     bmp.Width, bmp.Height); 
    originalPanel.DrawToBitmap(bmp, rect); 
    foreach (Control ctrl in originalPanel.Controls) 
    { 
     ctrl.Visible = false; 
    } 
    using (Graphics g = Graphics.FromHwnd(originalPanel.Handle)) 
    { 
     g.DrawImage(bmp, 0, 0); 
     bmp.Dispose(); 
     SolidBrush brush = 
      new SolidBrush(Color.FromArgb(128, Color.Gray)); 
     g.FillRectangle(brush, rect); 
     brush.Dispose(); 
    } 
    Panel floater = new Panel(); 
    floater.Size = originalPanel.Size; 
    floater.Left = originalPanel.Left - 50; 
    floater.Top = originalPanel.Top - 50; 
    this.Controls.Add(floater); 
    floater.BringToFront(); 
    return floater; 
} 

Этот метод занимает панель с некоторыми элементами управления на нем, привлекает панель со всеми его управления на временной растровый делает все элементы управления невидимыми, рисует временную растровую карту на панели, затем добавляет полупрозрачный серый слой на панель. Затем метод создает новую панель и плавает над исходной панелью, сверху и слева, а затем возвращает ее. Это в основном делает новую панель своего рода модальным всплывающим окном, вроде того, как иногда это делают веб-страницы.

Чтобы использовать это в вашей форме, поместите все элементы управления, которые вы хотите быть неактивными из-под на панель, то есть Click события вашего баттона сделать что-то вроде этого:

Panel floater = CreateFloatingPanel(panel1); 
floater.BackColor = Color.White; 
ListView lv = new ListView(); 
floater.Controls.Add(lv); 

Чтобы отменить эффект, вы просто удалите плавающую панель из коллекции элементов управления формы, затем снова сделайте видимыми все элементы управления на исходной панели, а затем обновите или недействите панель, чтобы избавиться от закрашенных элементов. Простой Invalidate будет работать, потому что эффект серого не сохраняется - чтобы получить, что вам придется сделать это все сложнее. Но это должно начаться, по крайней мере.

2

Не могли бы вы просто создать скрытую панель в конце формы, а затем сделать ее видимой, а затем перенести на передний план?

+0

Не нужно иметь его сзади, а затем вывести на передний план ... просто переключить его видимость. – JustLoren

+0

Не совсем то, что я хочу ... :( –