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

C# WPF如何实现CTRL+V粘贴时将PIN码逐位填入多个文本框

解决WPF 4位PIN码输入框粘贴分配问题

1. 调整XAML代码

将4个TextBox的TextChanged事件统一绑定到同一个处理方法,同时添加粘贴事件捕获,修改后的XAML如下:

<StackPanel Style="{DynamicResource HorizontalPanel}" >
    <Border Style="{DynamicResource DigitBorder}">
        <TextBox Style="{DynamicResource Digit1Text}" Name="Digit1" 
                 TextChanged="DigitTextBox_TextChanged"
                 DataObject.Pasting="DigitTextBox_Pasting" />
    </Border>
    <Border Style="{DynamicResource DigitBorder}">
        <TextBox Style="{DynamicResource Digit2Text}" Name="Digit2" 
                 TextChanged="DigitTextBox_TextChanged"
                 DataObject.Pasting="DigitTextBox_Pasting" />
    </Border>
    <Border Style="{DynamicResource DigitBorder}">
        <TextBox Style="{DynamicResource Digit3Text}" Name="Digit3" 
                 TextChanged="DigitTextBox_TextChanged"
                 DataObject.Pasting="DigitTextBox_Pasting" />
    </Border>
    <Border Style="{DynamicResource DigitBorder}">
        <TextBox Style="{DynamicResource Digit4Text}" Name="Digit4" 
                 TextChanged="DigitTextBox_TextChanged"
                 DataObject.Pasting="DigitTextBox_Pasting" />
    </Border>
</StackPanel>

注:原有的粘贴菜单功能不受影响,无需额外配置

2. 调整后台.xaml.cs代码

删除原有4个重复的TextChanged方法,替换为统一的事件处理逻辑,同时新增粘贴事件处理方法:

// 统一的单字符输入跳位逻辑
private void DigitTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    var currentTxt = sender as TextBox;
    if (currentTxt.Text.Length == 1)
    {
        // 按顺序找下一个输入框
        switch (currentTxt.Name)
        {
            case "Digit1": Digit2.Focus(); break;
            case "Digit2": Digit3.Focus(); break;
            case "Digit3": Digit4.Focus(); break;
        }
    }
}

// 粘贴事件处理逻辑
private void DigitTextBox_Pasting(object sender, DataObjectPastingEventArgs e)
{
    // 取消默认粘贴行为
    e.CancelCommand();
    
    // 读取剪贴板文本,过滤非数字字符
    if (e.DataObject.GetDataPresent(typeof(string)))
    {
        string pasteText = e.DataObject.GetData(typeof(string)) as string;
        // 只保留数字
        string cleanText = new string(pasteText.Where(char.IsDigit).ToArray());
        if (string.IsNullOrEmpty(cleanText)) return;
        
        // 按顺序存储4个输入框,方便遍历
        TextBox[] digitBoxes = new TextBox[] { Digit1, Digit2, Digit3, Digit4 };
        // 获取当前触发粘贴的输入框索引
        var currentBox = sender as TextBox;
        int startIndex = Array.IndexOf(digitBoxes, currentBox);
        
        // 依次填充字符到后续输入框
        for (int i = 0; i < cleanText.Length && startIndex + i < 4; i++)
        {
            digitBoxes[startIndex + i].Text = cleanText[i].ToString();
        }
        
        // 移动焦点到最后一个填充位的下一个输入框
        int finalIndex = Math.Min(startIndex + cleanText.Length, 3);
        digitBoxes[finalIndex].Focus();
        digitBoxes[finalIndex].SelectAll();
    }
}

功能说明

  • 粘贴1-4位纯数字时,会从当前聚焦的输入框开始依次向后填充对应位数
  • 剪贴板包含非数字字符时会自动过滤,只保留数字部分
  • 原有单字符输入自动跳位逻辑完全保留
  • 兼容Ctrl+V快捷键、右键菜单粘贴两种触发方式

内容的提问来源于stack exchange,提问作者Eden M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:15:00