2010-07-08 20 views
6

En WPF puedo especificar que un contenedor de control es un Enfoque y que la navegación de pestañas debe pasar por los controles (es decir, cuando cierro el control final, el foco volverá al primero):Detectar foco de WPF al alcance del foco

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

lo que estoy tratando de hacer es detectar cuando enfoque sale del campo final. Sin saber con precisión el número de controles dentro del alcance del foco, ¿alguien sabe si esto es posible?

+1

Al final pude solucionar mi problema específico utilizando la vista de colección predeterminada para mantener un registro del elemento actual y algunas propiedades adjuntas para mantenerlo en línea con el enfoque actual del teclado. –

Respuesta

-1

Por el bien de cerrar esta pregunta, voy a cambiar mi comentario a una respuesta. La solución fue esencialmente mantener un registro del elemento seleccionado dentro del modelo de vista y reaccionar a los cambios a eso. Como regla general, no creo que el modelo de vista tenga en cuenta el foco de control, pero en este caso creo que es necesario ya que el modelo de visualización debe reaccionar a los cambios de enfoque.

Al final pude solucionar mi problema concreto utilizando la vista de colección por defecto para mantener un registro del elemento actual, y algunos propiedades adjuntas a tener esto en línea con el teclado actual enfoque

0

Esta funcionalidad no parece estar integrada en WPF, como parece haber descubierto.

Mi recomendación sería construir un comportamiento adjunto para manejar esto.

Si tiene Blend y puede usar System.Windows.Interactivity, simplemente proceda de la clase Behavior y anule OnAttached y OnDetached. De lo contrario, escriba una clase de comportamiento estático como se demuestra here.

Cuando se adjunta el comportamiento, guarde el primer elemento enfocado (¿actual?) Y suscríbase a un evento de cambio de foco. En el controlador de eventos, rastree el elemento enfocado dentro del alcance del enfoque (el alcance al que se aplica el comportamiento). Cuando el elemento enfocado vuelve al primer elemento, activa un evento enrutado. Hay algunos detalles que tendrían que resolverse.

Cuestiones relacionadas