Авто-вкладка в Silverlight 3 - PullRequest
       15

Авто-вкладка в Silverlight 3

4 голосов
/ 31 августа 2009

У меня есть требование, чтобы иметь возможность автоматического перехода с одного элемента управления на «следующий элемент управления» в приложении SL3. Например, TextBox ограничен 3 символами - при вводе 3-го символа фокус должен автоматически переходить к следующему элементу управления в форме (мое фактическое использование немного отличается, но этого примера достаточно).

Однако, поскольку SL автоматически определяет последовательность вкладок, кажется, что нет способа сделать это, кроме обратного инжиниринга / дублирования логики Silverlight, чтобы выяснить, какой элемент управления в визуальном дереве должен быть следующим элементом управления, чтобы получить фокус.

Кто-нибудь уже реализовал это?

Ответы [ 2 ]

4 голосов
/ 31 августа 2009

Я искал довольно обобщенное решение - но я смог обойтись чем-то довольно конкретным - в основном он использует VisualTreeHelper для поиска потомков с тем же родителем, что и элемент управления, к которому я хочу добавить вкладку, и фокусируется на этом.

Это более приемлемое решение, чем обход всех моих элементов управления (и это для довольно большого LOB-приложения) и настройка «следующего» элемента управления для каждого из них.

Вот мой код, на случай, если он кому-нибудь поможет. (VisualTreeeHelperUtil - мой собственный класс, который добавляет некоторые служебные функции в VisualTreeHelper)

public static void TabNext(DependencyObject parentElement, Control fromControl)
{
    var children = VisualTreeHelperUtil.FindChildren<Control>(parentElement).
        Where(c => c.IsEnabled && c.IsTabStop && c.Visibility == Visibility.Visible).
        ToList();

    if (children.Contains(fromControl))
    {
        var thisIndex = children.IndexOf(fromControl);
        var targetIndex = thisIndex + 1;
        if (children.Count > targetIndex)
        {
            var targetChild = children[targetIndex];
            fromControl.Dispatcher.BeginInvoke(() =>
               {
                   targetChild.Focus();
                   var txt = targetChild as TextBox;
                   if (txt != null)
                   {
                       txt.SelectAll();
                   }
               });
        }
    }
}
2 голосов
/ 31 августа 2009

Если вы ищете обобщенное решение и все в порядке, основываясь на визуальном упорядочении дерева (в отличие от упорядоченного макета), я думаю, что это не так уж плохо. Тем не менее, не слышал о том, что это делается.

Большинство телефонных номеров или форм ввода кредитных карт, с которыми я сталкивался при таком поведении, честно просто жестко кодируют следующее поле в соответствующем обработчике изменений, когда введено правильное количество символов.

Поскольку звучит так, как будто ваше решение с автофокусировкой (для 3 символов) уже потребует некоторого подключения к событию, отслеживая событие TextChanged, не могли бы вы просто продолжить и 1) жестко закодировать Фокус ( ) к следующему известному элементу формы, 2) используйте свойство Tag, чтобы сохранить имя элемента управления, на который вы хотели бы сфокусироваться следующим образом, затем выполните FindName + Focus для этого, или 3) выполните какое-то VisualTreeHelper ( или логическое дерево поиска через пиров)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...