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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:58:56