2010-04-08 4 views
1

Я много раз искал SO и Google вокруг этой проблемы, но не могу найти ничего другого, чтобы попробовать.WPF Focus In Tab Control Content Когда создана новая вкладка

У меня есть MainView (окно), содержащее элемент управления вкладкой. Элемент управления вкладкой привязан к ObservableCollection дочерних элементов (пользовательских элементов управления). В ViewModel MainView есть метод, который позволяет добавлять в набор ChildViews, который затем создает новую вкладку. Когда создается новая вкладка, она становится активной вкладкой, и это отлично работает. Этот метод в MainView вызывается из другого ViewModel (OtherViewModel).

То, что я пытаюсь сделать, - установить фокус клавиатуры на первый элемент управления на вкладке (AutoCompleteBox из WPFToolkit *) при создании новой вкладки. Мне также необходимо настроить фокус таким же образом, но БЕЗ создания новой вкладки (поэтому установите фокус на текущей активной вкладке).

(* Обратите внимание, что с AutoCompleteBox возникают проблемы с фокусом - даже если у него есть фокус, вам нужно отправить MoveNext(), чтобы получить курсор в его окне. Я уже работал над этим).

Итак, вот в чем проблема. Фокусировка работает, когда я не создаю новую вкладку, но она не работает, когда я создаю новую вкладку. Обе функции используют один и тот же метод для установки фокуса, но логика создания сначала вызывает метод, который создает новую вкладку и устанавливает ее в активную. Код, который устанавливает фокус (в CodeBehind в ChildView в):

 IInputElement element1 = Keyboard.Focus(autoCompleteBox); 
     //plus code to deal with AutoCompleteBox as noted. 

В любом случае, Keyboard.FocusedElement начинается как MainView. После создания вызова вызов Keyboard.Focus, кажется, ничего не делает (сфокусированный элемент по-прежнему является MainView). Вызов этого без создания вкладки правильно устанавливает фокус клавиатуры в autoCompleteBox.

Любые идеи?

Update:

предложение Бендера наполовину работал.

Итак, теперь в обоих случаях сфокусированным элементом является правильно AutoCompleteBox. То, что я тогда делаю, это MoveNext(), который устанавливает фокус на TextBox. Я предполагаю, что это текстовое поле является внутренним для AutoCompleteBox, поскольку фокус был правильно установлен на экране, когда это произошло. Теперь я не уверен. Это по-прежнему поведение, которое я вижу, когда этот код попадает, когда НЕ делает создание. После создания MoveNext() устанавливает фокус на элемент обратно в мой MainView.

Проблема должна все же быть в соответствии с ответом Бендера, где состояние элементов управления не зависит от того, была ли создана новая вкладка или нет. Любые другие мысли?

Final Update

Как уже отмечалось, предложение majocha работал.

Я хотел обновить это на случай, если кто-то случится по этой же проблеме с автозаполнением. Похоже, что настройка фокуса не активирует его в пользовательском интерфейсе - вам нужно сделать MoveNext, чтобы переместить фокус вперед один раз во внутреннее текстовое поле элемента управления. Это основано на моем опыте отладки, который не может быть на 100% научным. Если у меня будет время, я попытаюсь создать небольшой репрограммный проект и отправить его команде WPFToolkit.

ответ

3

Вы можете попробовать defering изменения фокуса с

Dispatcher.BeginInvoke(MyChangeFocusAction, DispatcherPriority.ContextIdle); 

Он будет стоять в очереди после завершения макета и обновления свойств. Я не думаю, что это лучшая практика, но она работает для меня.

+0

Это сработало! Спасибо за вашу помощь. –

1

Контроль должен быть виден быть сфокусировано, вы можете попытаться отложить фокусировку подписавшись на IsVisibleChanged события, нечто подобное должно работать:

public static void setFocusLate(this Control control) 
     { 
      DependencyPropertyChangedEventHandler handler = null; 

      handler = delegate 
       { 
        control.Focus(); 
        control.IsVisibleChanged -= handler; 
       }; 

      control.IsVisibleChanged += handler; 
     } 
+0

Спасибо за ваш ответ. Посмотрите мое обновление, если у вас есть шанс. –

Смежные вопросы