2011-02-10 10 views
7

Tenemos un lienzo personalizado que tiene nodos especializados que se comportan mucho como las ventanas de una aplicación MDI estándar. El comportamiento deseado es que si alguno de los controles secundarios de la "ventana" tiene el foco, se dice que esa "ventana" está activa.¿Cómo puedo diseñar un control personalizado en función de si alguno de sus elementos secundarios tiene foco?

Ahora la propiedad IsFocused no parece conectarse en cascada, lo que significa que si un control secundario tiene el foco, su contenedor tampoco está configurado como "centrado", por lo que no podemos usarlo. Por la misma razón, no podemos establecer la propiedad IsFocused en el contenedor ya que creo que se lo robaría al niño.

Mi único pensamiento es crear un nuevo DP llamado HasChildWithFocus o algo así, luego en el código subyacente, escuchar los eventos burbujeantes y establecer ese indicador. No estoy seguro de que sea la mejor manera de hacerlo. (Podemos implementar eso como una combinación de propiedad adjunta/comportamiento adjunto algo así.)

Pero, por supuesto, sería mucho mejor si pudiéramos simplemente pedir un control 'Oye ... ¿tú o alguno de tus hijos tienen la ¿atención?'

¿Y usted?

+0

+1 a su idea de un comportamiento adjunto que escucha el evento burbujeante y establece una propiedad adjunta. Es la forma en que lo haría, ¡no puedo pensar en ninguna otra idea brillante! – ColinE

+0

Bueno, entonces +1 mi pregunta! Vamos ... ¡ayuda a un geek aquí! [sonrisa] (Gracias por tus comentarios. Sí ... esa era la única forma en que podía pensar) – MarqueIV

Respuesta

8

Puede utilizar UIElement.IsKeyboardFocusWithin directamente como esto:

<Grid> 
    <Grid.Resources> 
     <Style x:Key="panelStyle" TargetType="Border"> 
      <Setter Property="BorderBrush" Value="PaleGoldenrod"/> 
      <Style.Triggers> 
       <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
        <Setter Property="BorderBrush" Value="PaleGreen"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Resources> 
    <UniformGrid Columns="2"> 
     <Border BorderThickness="10" Style="{StaticResource panelStyle}"> 
      <StackPanel> 
       <TextBox Text="TextBox1"/> 
       <TextBox Text="TextBox2"/> 
      </StackPanel> 
     </Border> 
     <Border BorderThickness="10" Style="{StaticResource panelStyle}"> 
      <StackPanel> 
       <TextBox Text="TextBox3"/> 
       <TextBox Text="TextBox4"/> 
      </StackPanel> 
     </Border> 
    </UniformGrid> 
</Grid> 

En este ejemplo, la frontera que contiene el elemento con el foco del teclado es de estilo con un cepillo de borde diferente.

+0

¡Perfecto! Justo lo que quería. (No sabía acerca de esa propiedad.) El momento perfecto también, ya que acababa de comenzar a escribir las cosas adjuntas, así que ahora no tengo que hacerlo. :) – MarqueIV

Cuestiones relacionadas