You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bunifu UI文本框中设置或编码占位符/水印属性

解决Bunifu TextBox添加水印/占位符的问题

嘿,我懂你遇到的困扰了——想用Bunifu TextBox做登录凭证输入框,却找不到自带的水印属性,之前给原生TextBox用的SetCueText还不管用。别慌,这里有几个靠谱的解决办法,适配不同版本的Bunifu UI:


方法1:用Bunifu自带的PlaceholderText属性(推荐)

如果你的Bunifu UI是较新版本(比如Bunifu Framework v5+),其实已经内置了占位符功能,直接用就行,不用折腾API:

Private Sub Login_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.CenterToParent()
    ' 设置密码框的掩码
    BunifuTextbox2._TextBox.PasswordChar = "*"
    
    ' 直接给Bunifu TextBox设置占位符
    BunifuTextbox1.PlaceholderText = "Username"
    BunifuTextbox2.PlaceholderText = "Password"
End Sub

要是在属性面板里找不到PlaceholderText,记得检查你的Bunifu UI版本,更新到最新版就能看到这个属性了。


方法2:适配Bunifu的SetCueText API调用

如果你的Bunifu版本比较旧,没有内置占位符属性,那可以调整原生API的调用方式——因为Bunifu TextBox内部包裹了一个原生TextBox,得拿到它的句柄再发送消息:

Imports System.Runtime.InteropServices

Public Class Login
    ' 声明Windows API函数
    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
    Private Shared Function SendMessage(hWnd As IntPtr, Msg As Integer, wParam As Integer, lParam As String) As IntPtr
    End Function

    ' 设置提示文本的消息常量
    Private Const EM_SETCUEBanner As Integer = &H1501

    ' 给Bunifu TextBox设置占位符的自定义方法
    Private Sub SetCueText(bunifuTb As Bunifu.Framework.UI.BunifuTextbox, cueText As String)
        ' 注意:有些版本的Bunifu TextBox内部控件叫TextBox而不是_TextBox,报错的话改一下
        SendMessage(bunifuTb._TextBox.Handle, EM_SETCUEBanner, 0, cueText)
    End Sub

    Private Sub Login_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.CenterToParent()
        BunifuTextbox2._TextBox.PasswordChar = "*"
        
        ' 调用自定义方法设置占位符
        SetCueText(BunifuTextbox1, "Username")
        SetCueText(BunifuTextbox2, "Password")
    End Sub

如果编译时提示_TextBox不可访问,那大概率是Bunifu版本的问题,把bunifuTb._TextBox改成bunifuTb.TextBox试试。


方法3:自定义绘制占位符(万能适配)

要是上面两种方法都不适用,还可以自己在Paint事件里绘制占位符文本,完全可控:

Private Sub BunifuTextbox1_Paint(sender As Object, e As PaintEventArgs) Handles BunifuTextbox1.Paint
    Dim innerTb As TextBox = BunifuTextbox1._TextBox
    ' 只有输入框为空且未获得焦点时才绘制占位符
    If String.IsNullOrEmpty(innerTb.Text) AndAlso Not innerTb.Focused Then
        Using grayBrush As New SolidBrush(Color.Gray)
            ' 对齐输入框的内边距,让文本位置更自然
            e.Graphics.DrawString("Username", innerTb.Font, grayBrush, 
                New PointF(innerTb.Padding.Left, innerTb.Padding.Top))
        End Using
    End If
End Sub

' 焦点变化时触发重绘,显示/隐藏占位符
Private Sub BunifuTextbox1_Enter(sender As Object, e As EventArgs) Handles BunifuTextbox1.Enter
    BunifuTextbox1.Invalidate()
End Sub

Private Sub BunifuTextbox1_Leave(sender As Object, e As EventArgs) Handles BunifuTextbox1.Leave
    BunifuTextbox1.Invalidate()
End Sub

密码框的逻辑和这个一样,复制事件处理代码改一下控件名和占位符文本就行。


内容的提问来源于stack exchange,提问作者Lucifer Rodstark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:33:57