2

WinForms 对此有支持吗?假设我想显示一个包含由一些结果组成的 ListView 的面板。它通过单击表单角落中的按钮来显示,并且面板显示在表单内部,高于所有控件,最好在背面带有阴影以使其更具吸引力。

我希望此面板始终位于表单内,作为表单的一部分。我想到的一个解决方案是使用该面板创建一个无边框表单,并使其与原始表单同步。

可能还有其他我想念的方式吗?

4

2 回答 2

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 将起作用,因为灰色效果不会持续存在 - 要获得它,您必须使这一切变得更加复杂。但这至少应该让你开始。

于 2009-09-25T20:47:48.003 回答
3

你能不能在表单的后面创建一个隐藏的面板,然后让它可见,然后把它带到前面?

于 2009-09-25T19:34:19.967 回答