2011-02-01 10 views
13

tutto è nel titolo:cosa fa x: Key = "{x: Type TextBox}" fare?

ho letto più di una volta che l'impostazione di uno stile come questo:

<Style TargetType="TextBox">...</Style> 

era più o meno equivalente a:

<Style x:Key="{x:Type TextBox}" TargetType="TextBox">...</Style> 

(l'ultima volta in a comment on another question)

entrambi dovrebbero applicare lo stile a tutti i box di testo nell'app (se sono inseriti nelle risorse dell'app ovviamente)

ma ho provato entrambi nelle mie app e solo il secondo con i lavori definiti da x: Key.

mi sembra abbastanza logico, dal momento che il primo non sa dove essere applicato senza alcuna x: set di proprietà chiave, ma qual è il punto della prima sintassi?

Edit: esempio di codice nel mio app che funziona bene:

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
</Style> 

e il codice che non fa:

<Style TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
</Style> 

Ho scritto questo per sbarazzarsi dei problemi di rilegatura ottenere con comboBoxItems quando si manipola una fonte di elementi di un ComboBox esistente. E il primo codice funziona bene, ma il secondo no.

si può vedere questo facilmente impostando il HorizontalContentAlignment a destra

Edit 2: Questo codice viene semplicemente messo in un dizionario risorse nel mio App.xaml. E sostituendo TargetType = "{x: Tipo ComboBoxItem}" con TargetType = "ComboBoxItem" non fa differenza di sorta

Edit 3: Ho appena realizzato che potrei aver dimenticato di preciso qualcosa di importante (dispiace): sebbene il gli stili sono definiti in xaml, in realtà aggiungo i controlli al layout nel mio codice mentre vengono aggiunti dinamicamente. Potrebbe essere dove si trova il problema ...

risposta

9

Come mostrato nel primo esempio di cui sopra, impostando la proprietà TargetType a TextBlock senza assegnare lo stile con una x: Key permette il vostro stile di essere applicato a tutti gli elementi TextBlock. Ciò che accade in realtà è che così facendo imposta in modo implicito x: Key a {x: Type TextBlock}.Ciò significa anche che se lo assegna allo Style un valore x: Key di diverso da {x: Type TextBlock}, lo stile non sarà applicato a tutti gli elementi TextBlock automaticamente. Invece, è necessario applicare lo stile agli elementi TextBlock in modo esplicito.

Considerando che questo è from the official documentation, il problema deve essere un'anomalia. Ho visto alcune di queste stranezze e non sono tutte troppo inaspettate dal momento che la codifica dietro WPF è destinata a essere imperfetta.

(C'è una differenza nei risultati tra TargetType="ComboBoxItem" e TargetType="{x:Type ComboBoxItem}" se la chiave viene omesso?)

+0

Puoi approfondire cosa si intende qui:.! * in quanto la codifica essere hind WPF è destinato ad essere imperfetto. * Pensi che questo caso sia un bug in WPF? Penso che abbiamo bisogno di vedere molto più codice prima di poter arrivare a quella conclusione. –

+0

"Pensi che questo caso sia un bug in WPF?" Sì, è esattamente ciò che intendo. Non penso che tu abbia bisogno di più codice per giungere a questa conclusione perché abbiamo una descrizione di cosa * dovrebbe * accadere e un rapporto che in realtà non è sempre il caso. Il codice fornito sembra abbastanza semplice e se tutto il resto viene lasciato completamente lo stesso si può concludere che l'errore deve essere con un codice WPF di base. –

+0

Quindi, ciò che si sta dicendo è che è possibile combinare la proprietà TargetType con una proprietà x: Type. Quindi lo stile ComboBoxItem verrà applicato solo quando si è esplicitamente seduti in XAML. –

2

Ogni risorsa ha bisogno di una chiave, ma se viene omesso per uno stile, deve essere impostato di default sul tipo di TargetType. Quindi entrambi i frammenti sopra dovrebbero essere equivalenti.

È possibile pubblicare l'intero codice in cui non funziona senza la definizione esplicita Key?

+0

Ho modificato la mia domanda con altri esempi di codice – David

+0

@David - Dove nel tuo codice è definito questo stile? –

+0

Inoltre, nel tuo esempio non-lavoro, provare a sostituire TargetType = "{x: Tipo ComboBoxItem} con TargetType =" ComboBoxItem" –

4

Ora è possibile collegare in cascata gli stili con l'aggiunta di un:

BasedOn="{StaticResource {x:Type ComboBox}}" 

in un < stile/> ulteriormente in basso il documento, ad esempio:

<Window.Resources> 
    <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}"> 
      <Setter Property="HorizontalContentAlignment" Value="Left"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
     </Style> 
</Window.Resources> 
<StackPanel> 
    <TextBox>I'm Left-Center</TextBox> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
       <Setter Property="HorizontalContentAlignment" Value="Right"/> 
      </Style> 
     <Grid.Resources> 
     <TextBox>I'm Right-Center</TextBox> 
    </Grid> 
</StackPanel> 
+0

non conoscevo questa sintassi, interessante! in realtà non dice cosa fa x: key = "{x: type xxx}". – David

+0

Il tuo esempio funziona senza x: Key, quindi non è rilevante qui – Nicolas