2011-02-10 6 views
7

Abbiamo una tela personalizzata con nodi specializzati che si comportano molto come le finestre di un'applicazione MDI standard. Il comportamento desiderato è che se uno dei controlli figlio della "finestra" ha il focus, allora quella "finestra" è detta attiva.Come è possibile applicare uno stile a un controllo personalizzato in base al fatto che uno dei suoi figli è attivo?

Ora la proprietà IsFocused non sembra in cascata, il che significa che se un controllo figlio ha lo stato attivo, il contenitore non è impostato anche su "focalizzato", quindi non possiamo usarlo. Per lo stesso motivo, non possiamo impostare la proprietà IsFocused sul contenitore poiché ritengo che possa rubarlo dal bambino.

Il mio unico pensiero è creare un nuovo DP chiamato HasChildWithFocus o qualcosa del genere, quindi nel code-behind, ascoltare gli eventi spumeggiati e impostare quella bandiera. Non sono sicuro che sia il modo migliore di andare. (Possiamo implementarlo come una combinazione di proprietà associata/comportamento collegato.)

Ma ovviamente sarebbe molto meglio se potessimo semplicemente chiedere un controllo 'Ehi ... tu o qualcuno dei vostri figli avete il messa a fuoco?'

Quindi puoi?

+0

+1 alla tua idea di un comportamento collegato che ascolta l'evento bubbled e imposta una proprietà associata. È il modo in cui lo farei, non riesco a pensare ad altre idee brillanti! – ColinE

+0

Bene quindi +1 alla mia domanda! Dai ... aiuta un geek qui! [sorrisetto] (Grazie per il tuo feedback. Sì ... era l'unico modo in cui potevo pensare.) – MarqueIV

risposta

8

È possibile utilizzare UIElement.IsKeyboardFocusWithin direttamente in questo modo:

<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> 

In questo esempio il bordo che contiene l'elemento con il fuoco della tastiera è in stile con una spazzola bordo diverso.

+0

Perfetto! Proprio quello che volevo. (Non sapevo di quella proprietà.) Anche il tempismo perfetto perché avevo appena iniziato a scrivere le cose allegate, quindi ora non ne ho bisogno! :) – MarqueIV

Problemi correlati