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

