模拟产品密钥输入xaml c#

时间:2014-02-03 10:18:21

标签: c# xaml windows-store-apps windows-8.1

我正在使用Xaml后端构建基于C#的应用。

我的数据需要用户以特定格式输入(例如:AAAA-BBBBBB-CCCC-DD等)。我目前有一个文本框,可以完成整个过程,但是对于用户体验,我宁愿将示例文本分解为四个

  1. 一个AAAA
  2. 一个用于BBBBBB
  3. 一个CCCC
  4. 一个用于DD等
  5. 所以我对用户的期望非常清楚。这部分很容易使用字符串连接

    但我希望这四个方框的行为像基本上透明的方式一样。 用户在文本框1中输入4个字符后,焦点会转移到文本框2,他们可以继续输入。另外,如果可能的话,我希望焦点转移到选择所有文本已经在框中,这样他们就可以轻松覆盖而无需转到他们的鼠标或进行ctrl + a。

    我已经搜索了如何在texbox之间更改焦点,但无法获得示例。

3 个答案:

答案 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("-"))拆分文本,然后您将获得一系列代码(如果您需要这样的代码)。