2010-07-08 4 views
6

В WPF я могу указать, что контейнер управления представляет собой область фокусировки, и эта вкладка должна циклически перемещаться по элементам управления (т.е. когда я выхожу из конечного элемента управления, фокус возвращается к первому):Обнаружение фокуса WPF, достигающего конца области фокуса

<Border FocusManager.IsFocusScope="True" KeyboardNavigation.TabNavigation="Cycle"> 
<ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBox x:Name="Editor" Text="{Binding}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Border> 

То, что я пытаюсь сделать, это обнаружить когда фокус покидает последнее поле. Не зная точно количество элементов управления в области фокуса, кто-нибудь знает, возможно ли это?

+1

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

ответ

-1

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

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

0

Эта функциональность не кажется встроенной в WPF, как вы, кажется, обнаружили.

Моей рекомендацией было бы создать приложенное поведение для этого.

Если у вас есть Blend и вы можете использовать System.Windows.Interactivity, просто выведите из класса Behavior и переопределите OnAttached и OnDetached. В противном случае напишите класс статического поведения, как показано here.

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

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