c# - 设置用户控件的父级可防止其透明

标签 c# winforms user-controls transparency

我创建了一个简单的用户控件,它是用类似的东西手动创建的

MyUserControl ctrl = new MyUserControl();

该控件被设计为具有 BackColor = Color.Transparent 并且工作正常,直到我将控件的 Parent 设置为一个窗体,此时它变为变成表格的颜色。

听起来像是透明的,但它的作用是隐藏窗体上存在的所有控件。我不能 100% 确定它是获得纯色背景的控件还是当我连接它时发生的其他事情,这会阻止其他控件显示。

基本上如果你这样做

  • 创建表单
  • 在上面放一个按钮
  • 在按钮的点击处理程序中,您执行以下操作

例子

MyUserControl ctrl = new MyUserControl();
ctrl.Parent = this;
ctrl.BackColor = Color.Transparent;
ctrl.Size = this.Parent.ClientRectangle.Size;
ctrl.Location = this.Parent.ClientRectangle.Location;
ctrl.BringToFront();
ctrl.Show();

基本上,我希望用户控件覆盖整个表单,同时在表单上显示底层控件(因此是透明背景)。我不想将它添加到表单控件集合中,因为它实际上并不属于表单,它只是显示在其他所有内容之上

我尝试做同样的事情,但没有设置父级,但是控件根本没有显示。

谢谢!

编辑:如果我重写用户控件中的 OnPaintBackground 方法并阻止绘制背景,那么它就可以工作,但是这会弄乱使用 DrawImage 在控件中绘制的 PNG 图像的透明部分,这是有道理的。

最佳答案

Windows 窗体并不真正支持透明控件。
您可以通过覆盖控件的 CreateParams 属性并设置自定义样式(在谷歌上查找)来解决此限制。
此外,您必须重写控件的绘制,以便不仅重绘您的控件,而且重绘父控件。原因是背景必须在您的控件绘制自身之前绘制。
最后,您应该重写 OnPaintBackground 方法,就像您所做的那样,以确保没有绘制背景。

相当笨拙,并不完美,但应该可以。

关于c# - 设置用户控件的父级可防止其透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/373913/

相关文章:

c# - 带有数字键的动态 json 对象

c# - 如何限制整数最多允许 10 位数字

.net - 不同类型的用户控件的 WPF 列表

C#交集两个集合返回具有相交索引和新字段的集合

c# - 如何使用 JsonConverter 将我的字符串反序列化为十进制属性?

vb.net - 工具条按钮 = "Pressed"

c# - 将 ctrl+c 发送到 c# 中的 cmd.exe 进程

c# - 获取特定类型的所有控件

c# - Winform 不呈现控件更改

wpf - 什么时候应该使用 UserControl 而不是 Page?