c# - 表单内容的控件面板

标签 c# .net winforms forms panel

WinForms 是否支持此功能?假设我想显示一个包含由一些结果组成的 ListView 的面板。它是通过单击表单角上的按钮来显示的,面板显示在表单内部,位于所有控件之上,最好在后面有阴影,以使其更具吸引力。

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

我可能还缺少其他一些方式吗?

最佳答案

这是一个可以帮助您入门的粗略方法:

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;
}

此方法采用一个带有一些控件的面板,将面板及其所有控件绘制到临时位图上,使所有控件不可见,将临时位图绘制到面板上,然后在面板上添加半透明灰色图层。控制板。然后,该方法创建一个新面板并将其 float 在原始面板上方、左侧上方,然后返回它。这基本上使新面板成为一种模式弹出窗口,有点像网页有时的做法。

要在表单上使用此功能,请将所有要在面板下方变灰的控件放在面板上,然后让按钮的 Click 事件执行如下操作:

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

要撤消该效果,您只需从表单的控件集合中删除 float 面板,然后使原始面板上的所有控件再次可见,然后刷新或使面板无效以删除灰显的内容。简单的无效会起作用,因为变灰效果不会持续 - 要实现这一点,您必须使这一切变得更复杂一些。但这至少应该让您开始。

关于c# - 表单内容的控件面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1479152/

相关文章:

c# - 何时使用包含引用类型的值类型数组而不是引用类型数组?

c# - 让 FluentValidation 调用具有多个参数的函数

c# - OutOfMemoryException加载xml文档winmo 6.1

.net - 设计器中的属性更改未在设计器文件中更新 - Windows 窗体

java - 检查单选按钮的状态

c# - .NET Core 2.1 Web API 是否支持基于约定的路由?

c# - 通过 C# 应用程序在 SSMS 中打开新的数据库连接和查询窗口?

c# - 保留重新抛出的异常的类型

c# - .NET 事件特殊方法(添加/删除/提升/其他)

c# - 如何应用图形缩放并转换为 TextRenderer