我正在使用Xaml
后端构建基于C#
的应用。
我的数据需要用户以特定格式输入(例如:AAAA-BBBBBB-CCCC-DD等)。我目前有一个文本框,可以完成整个过程,但是对于用户体验,我宁愿将示例文本分解为四个框
所以我对用户的期望非常清楚。这部分很容易使用字符串连接
但我希望这四个方框的行为像基本上透明的方式一样。 用户在文本框1中输入4个字符后,焦点会转移到文本框2,他们可以继续输入。另外,如果可能的话,我希望焦点转移到选择所有文本已经在框中,这样他们就可以轻松覆盖而无需转到他们的鼠标或进行ctrl + a。
我已经搜索了如何在texbox之间更改焦点,但无法获得示例。
答案 0 :(得分:1)
您可以收听每个TextBox的TextChanged
事件,然后检查文本长度是否等于最大长度。如果它等于(或甚至更大)大于最大值,则将焦点移动到下一个TextBox并在那里选择所有文本。将逻辑重构为方法,以便您可以在每个TextBox的事件处理函数中调用相同的方法,因此可以避免重复编写类似的代码。这样的事情会做:
private void textboxAAAA_TextChanged(object sender, TextChangedEventArgs e)
{
HandleTextChanged(textboxAAAA, textboxBBBBBB, 4);
}
private void textboxBBBBBB_TextChanged(object sender, TextChangedEventArgs e)
{
HandleTextChanged(textboxBBBBBB, textboxCCCC, 6);
}
private void textboxCCCC_TextChanged(object sender, TextChangedEventArgs e)
{
HandleTextChanged(textboxCCCC, textboxDD, 4);
}
private void HandleTextChanged(TextBox currentTextBox, TextBox nextTextBox, int maxLength)
{
var textLength = currentTextBox.Text.Length;
if (textLength >= maxLength)
{
nextTextBox.Focus(FocusState.Keyboard);
nextTextBox.SelectAll();
}
}
//in XAML
<StackPanel Orientation="Horizontal">
<TextBox x:Name="textboxAAAA" Width="60" TextChanged="textboxAAAA_TextChanged"/>
<TextBlock Text="-"/>
<TextBox x:Name="textboxBBBBBB" Width="60" TextChanged="textboxBBBBBB_TextChanged"/>
<TextBlock Text="-"/>
<TextBox x:Name="textboxCCCC" Width="60" TextChanged="textboxCCCC_TextChanged"/>
<TextBlock Text="-"/>
<TextBox x:Name="textboxDD" Width="60"/>
</StackPanel>
注意,您不会考虑用户复制粘贴序列号的情况。如果用户复制7个字母文本,程序应该做什么,并将其粘贴到第一个文本框?
答案 1 :(得分:0)
其他解决方案:
1.-您在四个TextBox中配置了Sequencial TabIndex属性。 2.-在文本框中配置maxLength propoerties。 3.-在TextBoxex中的TextChanged事件中配置下一个方法。
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var tb = (TextBox)sender;
if (tb.Text.Length == tb.MaxLength)
{
var nextTB = this.PrincipalGrid.Children.OfType<TextBox>().Where(t => t.TabIndex == (tb.TabIndex + 1)).FirstOrDefault();
if (nextTB != default(TextBox))
nextTB.Focus();
}
}
答案 2 :(得分:0)
为什么不使用一个TextBox?监听文本更改,并在每次需要时在文本中包含短划线( - )。不允许用户键入破折号(忽略它们)。应该为剪贴板粘贴和整个产品密钥/文本验证做一些小的逻辑。稍后您可以通过String.Split( new Char("-"))
拆分文本,然后您将获得一系列代码(如果您需要这样的代码)。