如何在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
相关产品推荐
相关产品推荐

