Silvelright -установить tabindex пользовательских элементов в MVVM

#silverlight #mvvm #tabindex #uielement

#silverlight #mvvm #tabindex #пользовательский элемент

Вопрос:

Я пытаюсь установить индекс табуляции из двух UIElement элементов в пользовательском элементе управления. Пользовательский элемент управления содержит текстовое поле и кнопку. В настоящее время у меня есть фокус, применяемый к текстовому полю с помощью прикрепленного свойства, однако я хотел бы иметь возможность нажимать клавишу tab и переходить от текстового блока к кнопке или определять нажатие клавиши (клавиша 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 не существует для элемента управления button. Есть идеи, почему это не удается?

Ответ №1:

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

Комментарии:

1. Я полностью согласен со Скоттом, и я слышал, как другие высказывали то же самое в том, что если код специфичен для представления, он может быть обработан в коде представления позади.

2. Итак, почему вы делаете это с прикрепленными свойствами вместо свойства TabIndex текстового поля / кнопки?

3. Из того, что я обнаружил, то, как инициализируется пользовательский элемент управления (при загрузке в представление), «предотвращает» установку свойств TabIndex в xaml. Решением, которое я нашел для устранения этой аномалии, было использование связанных свойств (в аренде с проектом MVVM).

Ответ №2:

Уже поздно… Я решил эту проблему, используя прикрепленное свойство. в приведенном выше решении я скопировал более ранний 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 amp;amp; 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 и добавьте его к элементам управления.