C# Windows窗体应用透明按钮

15

我刚接触 C#,想创建一个不可见的按钮,但在 C# 窗体应用程序中它们仍然可以被点击。有没有办法?我尝试将 BackColor 设为 Transparent,但这并不能改变它是透明的这一事实。


可能是这个问题的重复:https://dev59.com/nHNA5IYBdhLWcg3wHp-B - Chris Dworetzky
窗口控件的透明度目前不起作用(不支持)。 - Mitja Bonca
不要重复造轮子,试试这个链接: https://dev59.com/nHNA5IYBdhLWcg3wHp-B - user1391380
标签本身并不是真正的透明。 - Asmo
6个回答

36

很简单,试试这个。

点击想要使透明的按钮。 从属性中选择FlatStyle并将其设置为popup 现在将BackColor属性更改为Transparent

这将使按钮透明。

但是如果您想使它透明覆盖在PictureBox上,此方法将不起作用。

它只适用于普通背景和背景图像。希望它好用....


1
太棒了!到目前为止最佳答案。 - Michael Pliskin
3
如果您也想要一个透明的边框,将FlatStyle设置为“Flat”,然后将FlatAppearance:BorderSize设置为0(零)。 - Jamesckel
目前在VS 2022 XD中无法工作,2022年。 - user17161735

7
buttonLink.FlatStyle = FlatStyle.Flat; 
buttonLink.BackColor = Color.Transparent;
buttonLink.FlatAppearance.MouseDownBackColor = Color.Transparent;
buttonLink.FlatAppearance.MouseOverBackColor = Color.Transparent;

4
请提供一些描述它如何实现其功能的上下文,并提供一个更大且格式更好的代码片段。如果您有找到它的链接,请提供链接。 - Jordan Dea-Mattson
目前在VS 2022 XD中无法工作,现在是2022年。 - user17161735

2

1
来自该页面的更为相关的注释:“即使将BackColor属性设置为Transparent,Button控件也不支持透明背景颜色。” - Heath Raftery
1
该页面上还有一个更相关的注释:“即使将BackColor属性设置为透明,按钮控件也不支持透明背景色。” - Heath Raftery

1

参考:

原始文章和代码可在以下链接找到:

当鼠标悬停在禁用的控件上时显示工具提示

@ CodeProject 由tetsushmz提供

代码:

public class TransparentSheet : ContainerControl
{
    public TransparentSheet()
    {
        // Disable painting the background.
        this.SetStyle(ControlStyles.Opaque, true);
        this.UpdateStyles();

        // Make sure to set the AutoScaleMode property to None
        // so that the location and size property don't automatically change
        // when placed in a form that has different font than this.
        this.AutoScaleMode = AutoScaleMode.None;

        // Tab stop on a transparent sheet makes no sense.
        this.TabStop = false;
    }

    private const short WS_EX_TRANSPARENT = 0x20;

    protected override CreateParams CreateParams
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        get
        {
            CreateParams l_cp;
            l_cp = base.CreateParams;
            l_cp.ExStyle = (l_cp.ExStyle | WS_EX_TRANSPARENT);
            return l_cp;
        }
    }
}

解释:

您需要做的是将给定的控件用作覆盖在您禁用的TextBox上(正如您在其中一条评论中提到的)。订阅覆盖控件的Click事件,这样您就可以在禁用的控件上单击了。

我强烈反对这种方法,感觉有点像黑客行为。您真的应该寻找替代方案,而不是必须在禁用的控件上使用覆盖控件。

也许可以考虑使用不同的UI,或者至少将其包装在一个UserControl中以隔离这个混乱的逻辑。


0
将按钮的背景属性设置为透明仍然会留下边框。如果您想要完全透明的按钮,请执行以下两个操作之一:
1. 创建一个透明面板并分配一个方法到单击事件。
2. 更好的方法是创建一个自定义用户控件,该控件只填充了BackColor(设置为透明),并将方法分配给Click事件。
public class Invisible_Button : UserControl
{
    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        this.Cursor = Cursors.Hand;
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), 0, 0, this.Width, this.Height);
    }
}

-1
你试过 button.Visible = false 吗?如果你只是想隐藏它,这样做就可以了。

如果你想对按钮控件进行任何操作,比如点击它,那么这种方法是行不通的。 - Chris Dworetzky
1
同意,但不清楚他是想隐藏它直到某个事件发生,还是想在其他元素上放置一个透明的按钮。 - nunespascal
由于该属性,我无法点击按钮。实际上,我想要一个文本框的单击事件(属性:Enabled = false),这样当我单击它时,它将返回一个值。但是由于它无法执行此操作,我必须想出一个不可见的按钮/标签,但是可以点击。 - Asmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接