#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 и добавьте его к элементам управления.