VB.NET继承TextBox控件报错:自定义大写输入用户控件开发求助
实现仅允许输入大写字母的WPF TextBox用户控件
看起来你正在完成一个很实用的作业,目标是打造一个只能输入大写字母的自定义TextBox控件。我看了你已经写的代码,这里给你补充完善的思路和完整的实现方案:
首先,先把你已有的代码整理完整,并且补充关键的逻辑:
Imports System.ComponentModel Imports System.Windows.Controls Imports System.Windows.Input Partial Public Class textboxupper_uc Inherits TextBox Dim strUpperText As String Sub New() InitializeComponent() ' 绑定输入拦截事件,从源头限制输入内容 AddHandler Me.PreviewTextInput, AddressOf textboxupper_uc_PreviewTextInput End Sub Public Property uppText As String Get Return strUpperText End Get Set(value As String) ' 将输入值转为大写后存储,同时处理空值情况 strUpperText = value?.ToUpper() ' 同步更新TextBox的显示文本,确保属性值和界面显示一致 If Me.Text <> strUpperText Then Me.Text = strUpperText End If End Set End Property ' 重写文本变更事件,处理粘贴或其他批量输入的文本 Protected Overrides Sub OnTextChanged(e As TextChangedEventArgs) MyBase.OnTextChanged(e) ' 避免循环触发:只有当当前文本和存储的大写文本不一致时才更新 If Me.Text <> strUpperText Then strUpperText = Me.Text.ToUpper() ' 临时移除事件处理,防止设置Text时再次触发OnTextChanged RemoveHandler Me.TextChanged, AddressOf Me.OnTextChanged Me.Text = strUpperText AddHandler Me.TextChanged, AddressOf Me.OnTextChanged ' 将光标定位到文本末尾,提升输入体验 Me.CaretIndex = Me.Text.Length End If End Sub ' 拦截输入事件,只允许大写字母或控制字符(如退格)输入 Private Sub textboxupper_uc_PreviewTextInput(sender As Object, e As TextCompositionEventArgs) Dim isValidInput = True For Each c In e.Text If Not Char.IsUpper(c) And Not Char.IsControl(c) Then isValidInput = False Exit For End If Next ' 如果输入不符合要求,则拦截该输入 If Not isValidInput Then e.Handled = True ' 也可以选择自动将输入转为大写后添加,替换上面的拦截逻辑: ' Me.Text += e.Text.ToUpper() ' e.Handled = True End If End Sub End Class
关键改进点说明:
- 完善
uppText属性:在Set方法中同步更新TextBox的显示文本,确保控件的属性值和界面展示保持一致,同时处理了输入值为null的边界情况。 - 重写
OnTextChanged:覆盖默认的文本变更逻辑,处理用户通过粘贴、快捷键等方式输入的文本,自动转为大写;同时通过临时移除事件绑定避免循环触发问题,最后调整光标位置优化输入体验。 - 处理
PreviewTextInput事件:从输入源头拦截非大写字母的内容(控制字符除外),确保用户无法输入小写字母;你也可以根据需求选择自动将输入转为大写而非直接拦截。
这样你的控件就能完美实现仅允许输入大写字母的功能啦!
内容的提问来源于stack exchange,提问作者Pratibha
相关产品推荐
相关产品推荐

