WinForms是否支持此功能?假设我想显示一个包含由某些结果组成的ListView的面板。通过单击表单角落中的按钮显示,面板显示在表单内部,在所有控件上方,最好在后面有阴影,以使其更具吸引力。
我希望此面板始终位于表单内部,作为其中的一部分。我想到的一个解决方案是使用该面板创建无边框表单,并使其与原始表单同步。
我可能还有其他方法吗?
答案 0 :(得分: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);
要撤消效果,您只需从表单的Controls集合中删除浮动面板,然后再次显示原始面板上的所有控件,然后刷新或使面板无效以消除灰显的内容。简单的Invalidate将起作用,因为灰色效果不会持久 - 为了得到你必须使这一切变得更复杂。但这应该让你开始,至少。
答案 1 :(得分:2)
你能在Form的后面创建一个隐藏的Panel,然后让它可见,然后把它带到前面吗?