2010-03-05 22 views
5

Estoy buceando en WPF y encuentro esto un poco extraño y frustrante para mi estilo: ¿Por qué el valor de algo puede ser un Recurso pero no puede establecer el valor directamente a lo que representa el Recurso? Ejemplo:¿Por qué debo usar "Recursos" en WPF?

Esto es válido:

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

Pero esto no es:

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

¿Cuál es la diferencia? ¿Por qué ambos no funcionan? No me gusta tener que crear un "Recurso" para algunas cosas porque divide mi código y puede hacer que sea más difícil de leer.

Y sí, sé mi ejemplo se puede simplificar como esto

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

pero ese no es el punto.

+1

¿Por qué es esto una Wiki de Comminity? – AnthonyWJones

+0

Por lo tanto, cualquier información errónea que publique podría editarse. ¿No fue eso correcto? – tyriker

Respuesta

3

Al trabajar con los instaladores, el valor para el colocador debe ser compatible con la capacidad de "congelarse". Puede ser un tipo de valor (incluidas estructuras y enumeraciones) o una clase que se deriva de Freezable.

Puede que no ayude mucho a su sentido estético, pero a menudo es más limpio declarar todos sus recursos en la sección Recursos del archivo (o ResourceDictionary), en lugar de agregarlos a los Recursos de un estilo individual o control

+0

Esto me hizo tropezar por un tiempo. Una vez que se da cuenta de los beneficios de rendimiento de que algo se congele, tiene sentido por qué la EM fuerza valores para que los instaladores sean congelables. –

+0

Entonces, ¿está diciendo que al hacer un recurso , lo estoy congelando? De lo contrario, puedo tener la oportunidad de cambiar una propiedad del en tiempo de ejecución, que es una carga de rendimiento para el subsistema de diseño/dibujo. ¿Es eso lo esencial? – tyriker

+1

No, no está siendo congelado, StaticResource es el elemento en el setter que está congelado. Cuando se crea el árbol visual de la plantilla, puede encontrar el elemento Image no congelado. Como Image no se deriva de Freezable, no se puede congelar, lamentablemente, por lo que no se puede usar en un setter. –