2014-02-03 3 views
0

Я создаю приложение на основе Xaml с базой данных C#.Эмуляция ввода ключа продукта xaml C#

У меня есть данные, которые должны быть введены пользователем в определенном формате (пример: AAAA-BBBBBB-CCCC-DD и т. Д.). Я в настоящее время есть один текстовое поле, которое принимает все это, но для пользовательского опыта, я бы предпочел, чтобы сломать пример текста в четыре коробки

  1. один для AAAA
  2. один для BBBBBB
  3. один для КЦИК
  4. один для DD и т.д.

Так что я ожидаю от пользователя будет совершенно ясно. Эта часть достаточно проста с конкатенацией строк

Но я хотел бы, чтобы четыре коробки вели себя как одна коробка в в значительной степени прозрачной форме. Как только пользователь вводит 4 символа в текстовое поле 1, фокус сместит в текстовое поле 2, и они могут продолжать печатать. Кроме того, если это возможно, я бы хотел, чтобы фокус смещался до , чтобы выделить весь текст уже в поле, чтобы они могли легко перезаписываться без необходимости нажимать на мышь или делать ctrl + a.

Я искал, как изменить фокус между texboxes, но не смог получить примеры для работы.

ответ

1

Вы можете прослушивать событие 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 букв и вставляет его в первое текстовое поле?

+0

Я думаю, что идеальное поведение, если пользовательская копия слишком много вставляет в поле, состоит в том, чтобы проверять и расширять допустимые символы в оставшихся отрезках, если они превышают лимит. – Finna

+0

Что делать, если в следующем текстовом поле уже есть текст внутри? замените его лишними буквами из текущего текстового поля или добавьте вместо замены? – har07

+1

Я заработал.Скопировать палочку с большей, чем разрешенной, строкой, заменяет следующее поле лишними символами. – Finna

0

Другое решение:

1.- конфигурируется sequencial свойства TabIndex в вашем четыре TextBoxes. 2.- Вы настраиваете propoerties maxLength в своих текстовых блоках. 3.- Вы настраиваете следующий метод в событии TextChanged в TextBoxex.

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(); 
    } 

} 
0

Почему бы не использовать один текстовый блок? Слушайте текстовые изменения и включайте тире (-) в тексте каждый раз, когда это необходимо. Не разрешайте пользователю вводить тире (игнорируйте их). Некоторая небольшая логика должна выполняться для вставки буфера обмена и для проверки всего продукта/текста. Позже вы можете разделить текст на String.Split(new Char("-")), и вы получите массив кодов (если вам это нужно).

Смежные вопросы