Silvelright-set tabindex UIElements в MVVM - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь установить индекс вкладки двух UIElement с в пользовательском элементе управления.Пользовательский элемент управления содержит текстовое поле и кнопку.У меня есть фокус, который в настоящее время применяется к текстовому полю через присоединенное свойство, однако я хотел бы иметь возможность нажимать клавишу табуляции и перемещаться от текстового блока к кнопке или определять нажатие клавиши (клавиша Enter) и запускать команду на кнопке.(Я знаю отдельный вопрос)

Основное внимание уделяется сначала выполнению индекса вкладки.

Спасибо за любые указатели или предложения.

ОБНОВЛЕНИЕ

С тех пор я пытался использовать присоединенное свойство для обработки порядка табуляции

        public static DependencyProperty TabIndexProperty = DependencyProperty.RegisterAttached("TabIndex", typeof(int), typeof(AttachedProperties), null);
    public static void SetTabIndex(UIElement element, int value)
    {
        Control c = element as Control;
        if (c != null)
        {

            RoutedEventHandler loadedEventHandler = null;
            loadedEventHandler = new RoutedEventHandler(delegate
                {
                    HtmlPage.Plugin.Focus();
                    c.Loaded -= loadedEventHandler;
                    c.Focus();
                });
            c.Loaded += loadedEventHandler;
        }
    } 

Однако, когда я пытаюсь скомпилировать, я получаю сообщения об ошибках, что свойство TabIndex не существует для элемента управления кнопки.Есть идеи, почему это не удается?

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

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

0 голосов
/ 11 мая 2011

Уже поздно ... Я решил это с помощью прикрепленного свойства. В приведенном выше решении я скопировал ранее созданный DP и не изменил код до тестирования.

Ниже приведен рабочий раствор

Я создал класс прикрепленных свойств, а затем добавил следующий код:

       #region Search Field Focus

    public static DependencyProperty InitialFocusProperty = DependencyProperty.RegisterAttached("InitialFocus", typeof(bool), typeof(AttachedProperties), null);

    public static void SetInitialFocus(UIElement element, bool value)
    {
        Control c = element as Control;
        if (c != null && value)
        {
            RoutedEventHandler loadedEventHandler = null;
            //set focus on control
            loadedEventHandler = new RoutedEventHandler(delegate
                {
                HtmlPage.Plugin.Focus();
                c.Loaded -= loadedEventHandler;
                c.Focus();
            });
            c.Loaded += loadedEventHandler;
        }
    }

    public static bool GetInitialFocus(UIElement element)
    {
        return false;
    }
    #endregion

    #region Tabbing Order of Elements

    public static DependencyProperty TabIndexProperty = DependencyProperty.RegisterAttached("TabIndex", typeof(int), typeof(AttachedProperties), null);
    public static void SetTabIndex(UIElement element, int value)
    {
        element.SetValue(TabIndexProperty, value);
    }

    public static int GetTabIndex(UIElement element)
    {
        return (int)element.GetValue(TabIndexProperty);
    }
    #endregion

Первый DP устанавливает фокус текстового блока так, что при загрузке пользовательского элемента управления вы видите курсор, помещенный в текстовое поле.

DP 2 устанавливает порядок табуляции. Так как фокус уже применен к текущему элементу управления, вкладка становится на свои места нормально. Если вы не сфокусировались на элементе управления, вам нужно сначала установить его.

затем, наконец, в xaml объявите свой класс в xmlns и добавьте элементы управления.

...