Під час розробки WPF-додатків можуть виникати різноманітні проблеми, пов’язані з переміщенням фокусу між елементами керування. У цій статті ми розглянемо одну з таких проблем – переміщення фокусу всередині UserControl.
Для початку розглянемо контекст проблеми. Уявімо, що ми будуємо власний контроль DatePicker у WPF, використовуючи UserControl. Наш контроль містить три текстові поля (TextBoxes), які призначені для введення дня, місяця та року, відповідно до поточної CultureInfo. Одним із завдань є спрощення введення даних, переміщуючи фокус з одного текстового поля в інше при введенні даних.
Однак при спробі реалізувати цю функціональність можуть виникати проблеми. Незважаючи на те, що фокус може успішно переміщатися між текстовими полями, він завжди закінчується на першому з трьох текстових полів всередині UserControl.
Давайте розглянемо деякі спроби вирішення цієї проблеми та можливі причини, що призводять до цього небажаного результату.
Одним з перших кроків у вирішенні проблеми є аналіз вихідного коду, де відбувається переміщення фокусу між текстовими полями. Давайте розглянемо фрагмент коду, який відповідає за цю функціональність:
1 2 3 4 5 6 7 8 9 10 11 |
```csharp private void _DateTextBox_TextChanged(object sender, TextChangedEventArgs e) { EvolutionTextbox textBox = sender as EvolutionTextbox; string tagText = textBox.TagText.ToString(); int value; bool emptyText = false; bool isNumber = Int32.TryParse(textBox.InputText, out value); // Опускаємо рядок, щоб зберегти місце // Код обробки введених даних та переміщення фокусу } |
У цьому фрагменті коду ми маємо обробник події TextChanged для текстового поля. Під час кожного зміни тексту в текстовому полі викликається цей обробник події.
Далі в коді відбувається опрацювання введених даних та визначення поточного рядка, який змінюється, за допомогою switch-оператора. У нашому випадку ми також маємо умови, що визначають, коли потрібно перемістити фокус з одного текстового поля в інше.
З цього коду відомо, що переміщення фокусу відбувається за допомогою методу MoveFocus(), який викликається у випадку, якщо введено два символи в текстовому полі для дня або місяця, або чотири символи в текстовому полі для року.
Причини, що призводять до неправильного переміщення фокусу всередині UserControl, можуть бути різноманітні. Розглянемо деякі можливі причини: