2010-03-05 17 views
5

Mi sto semplicemente immergendo in WPF e trovo questo un po 'strano e frustrante per il mio stile: perché il valore di qualcosa può essere una risorsa ma non è possibile impostare direttamente il valore su ciò che rappresenta la risorsa? Esempio:Perché devo usare "Risorse" in WPF?

Questo è valido:

<ToggleButton> 
    <ToggleButton.Resources> 
     <Image x:Key="cancelImage" Source="cancel.png" /> 
    </ToggleButton.Resources> 
    <ToggleButton.Style> 
     <Style TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Content" Value="{DynamicResource cancelImage}" /> 
     </Style> 
    </ToggleButton.Style> 
</ToggleButton> 

Ma non è questo:

<ToggleButton> 
    <ToggleButton.Style> 
     <Style TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Content"> 
       <Setter.Value> 
        <Image Source="cancel.png" /> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ToggleButton.Style> 
</ToggleButton> 

Qual è la differenza? Perché entrambi non funzionano? Non mi piace dover creare una "Risorsa" per alcune cose perché divide il mio codice e può renderlo più difficile da leggere.

E sì, so il mio esempio può essere semplificata come questo

<ToggleButton> 
    <Image Source="cancel.png" /> 
</ToggleButton> 

ma non è questo il punto.

+1

Perché questo è un Wiki Comminity? – AnthonyWJones

+0

Quindi qualsiasi informazione errata che ho postato potrebbe essere modificata. Non era corretto? – tyriker

risposta

3

Quando si lavora con setter, il valore per il setter deve supportare la possibilità di essere "congelato". Può essere un tipo di valore (incluse le strutture e le enumerazioni) o una classe derivata da Freezable.

Potrebbe non essere di grande aiuto per il vostro senso estetico, ma è spesso più pulito dichiarare tutte le risorse nella parte superiore della sezione Risorse del file (o ResourceDictionary), anziché aggiungerle alle Risorse di uno stile individuale o controllo.

+0

Questo mi ha fatto incazzare per un po '. Una volta che ti rendi conto dei vantaggi prestazionali di qualcosa che è stato congelato, è logico che la MS imponga che i valori per i setter siano liberamente congelabili. –

+0

Quindi stai dicendo di creare una risorsa , la sto congelando? In caso contrario, potrei avere l'opportunità di modificare una proprietà di in fase di runtime, il che rappresenta un onere per le prestazioni per il sottosistema di layout/disegno. È questo il senso? – tyriker

+1

No, non viene congelato, StaticResource è l'elemento nel setter che viene congelato. Quando viene creato l'albero visivo del modello, può trovare l'elemento Immagine non congelato. Poiché Image non deriva da Freezable, purtroppo non può essere congelato, motivo per cui non è possibile utilizzarlo in un setter. –