¿Cuál es la diferencia entre StaticResource y DynamicResource en WPF?

Al utilizar recursos como pinceles, plantillas y estilos en WPF, se pueden especificar como StaticResources

 

o como un DynamicResource

  

La mayoría de las veces (¿siempre?), Solo uno funciona y el otro lanzará una excepción durante el tiempo de ejecución. Pero me gustaría saber por qué:

  • Cual es la diferencia principal. Como implicaciones de memoria o rendimiento
  • ¿Hay reglas en WPF como “los pinceles son siempre estáticos” y “las plantillas son siempre dinámicas”, etc.?

Supongo que la elección entre Estático vs Dinámico no es tan arbitrario como parece … pero no veo el patrón.

Un StaticResource se resolverá y asignará a la propiedad durante la carga del XAML que ocurre antes de que la aplicación se ejecute realmente. Solo se asignará una vez y se ignorarán los cambios al diccionario de recursos.

Un DynamicResource asigna un objeto Expression a la propiedad durante la carga pero en realidad no busca el recurso hasta el tiempo de ejecución cuando se solicita el valor al objeto Expression. Esto posterga la búsqueda del recurso hasta que sea necesario en tiempo de ejecución. Un buen ejemplo sería una referencia directa a un recurso definido más adelante en XAML. Otro ejemplo es un recurso que ni siquiera existirá hasta el tiempo de ejecución. Actualizará el objective si se cambia el diccionario de recursos de origen.

También estaba confundido acerca de ellos. Vea este ejemplo a continuación:

          

Aquí he usado el recurso dynamic para el botón y la ventana y no lo he declarado en ninguna parte. En el tiempo de ejecución, se revisará el ResourceDictionary de la jerarquía. Como no lo he definido, creo que se utilizará el predeterminado.

Si agrego el siguiente código para hacer clic en el evento de Button, ya que usan DynamicResource, el fondo se actualizará en consecuencia.

 private void ButtonNew_Click(object sender, RoutedEventArgs e) { this.Resources.Add( "PinkBrush" ,new SolidColorBrush(SystemColors.DesktopColor) ); } 

Si hubieran usado StaticResource:

  • El recurso debe declararse en XAML
  • Y eso también “antes” se usan.

Espero haber aclarado algo de confusión.

StaticResource se resolverá en la construcción del objeto.
DynamicResource se evaluará y resolverá cada vez que el control necesite el recurso.

Los recursos lógicos le permiten definir objetos en XAML, que no son parte del árbol visual, pero se pueden usar en su interfaz de usuario. Uno de los ejemplos de un recurso lógico es Brush, que se utiliza para proporcionar un esquema de color. En general, esos objetos se definen como recursos, que son utilizados por múltiples elementos de las aplicaciones.

       

Ahora, el recurso anterior declarado podría usarse como recurso estático o dynamic. Un punto para recordar es que, al usar recursos estáticos, primero debe definirse en código XAML, antes de poder referirse. Los recursos estáticos y dynamics se pueden usar como:

  

o:

  

La diferencia entre StaticResource y DynamicResource radica en cómo los recursos son recuperados por los elementos de referencia. StaticResource se recupera solo una vez mediante el elemento de referencia y se usa durante toda la vida útil del recurso. Por otro lado, DynamicResource se adquiere cada vez que se utiliza el objeto al que se hace referencia.

Poniéndolo de manera más simple, si la propiedad de color de RadialGradientBrush cambia en el código a Naranja y Rosa, entonces se reflejará en los elementos solo cuando el recurso se use como DynamicResource. A continuación se muestra el código para cambiar el recurso en el código:

 RadialGradientBrush radialGradientBrush = new RadialGradientBrush(Colors.Orange, Colors.Pink); this.Resources["myGradientBrush"] = radialGradientBrush; 

La desventaja de DynamicResource es que reduce el rendimiento de la aplicación porque los recursos se recuperan cada vez que se utilizan. La mejor práctica es utilizar StaticResource hasta que haya una razón específica para usar DynamicResource.

Fuente:
WPF: StaticResource vs. DynamicResource

  1. StaticResource usa el primer valor. DynamicResource usa el último valor.
  2. DynamicResource se puede usar para estilos nesteds, StaticResource no.

Supongamos que tiene este diccionario de estilo nested. LightGreen está en el nivel raíz mientras Pink está nested dentro de una Grilla.

       

En vista:

             

StaticResource mostrará el botón como LightGreen, el primer valor que encontró en el estilo. DynamicResource anulará el botón LightGreen como rosa, ya que representa la cuadrícula.

StaticResource StaticResource

DynamicResource DynamicResource

Tenga en cuenta que VS Designer trata DynamicResource como StaticResource. Obtendrá el primer valor. En este caso, VS Designer renderizará el botón como LightGreen aunque en realidad termine en color rosa.

StaticResource emitirá un error cuando se elimine el estilo de nivel raíz (LightGreen).

Cual es la diferencia principal. Como implicaciones de memoria o rendimiento

La diferencia entre los recursos estáticos y dynamics se produce cuando el objeto subyacente cambia. Si su Pincel definido en la colección de Recursos fue accedido en código y configurado en una instancia de objeto diferente, Rectángulo no detectará este cambio.

Los recursos estáticos se recuperaron una vez haciendo referencia al elemento y se usaron durante el tiempo de vida de los recursos. Mientras que, DynamicResources recupera cada vez que se utilizan.

La desventaja de los recursos dynamics es que tienden a disminuir el rendimiento de la aplicación.

¿Hay reglas en WPF como “los pinceles son siempre estáticos” y “las plantillas son siempre dinámicas”, etc.?

La mejor práctica es usar recursos estáticos a menos que exista un motivo específico por el cual desee cambiar el recurso en el código subyacente de forma dinámica. Otro ejemplo de instancia en la que desearía usar resoruces dinámicas incluye cuando usa los SystemBrushes, SystenFonts y los parámetros del sistema.

Encontré todas las respuestas útiles, solo quería agregar un caso de uso más.

En un escenario compuesto de WPF, su control de usuario puede hacer uso de los recursos definidos en cualquier otra ventana / control principal (que va a hospedar este control de usuario) al referirse a ese recurso como DynamicResource.

Como se mencionó por otros, Staticresource se buscará en tiempo de comstackción. Los controles de usuario no pueden hacer referencia a los recursos que están definidos en el control de hosting / principal. Sin embargo, DynamicResource podría ser utilizado en este caso.

Importante beneficio de los recursos dynamics

si el inicio de la aplicación lleva mucho tiempo, debe usar recursos dynamics, ya que los recursos estáticos siempre se cargan cuando se crea la ventana o la aplicación, mientras que los recursos dynamics se cargan cuando se usan por primera vez.

Sin embargo, no verá ningún beneficio a menos que su recurso sea extremadamente grande y complejo.

La diferencia entre StaticResource y DynamicResource radica en cómo los recursos son recuperados por los elementos de referencia. StaticResource se recupera solo una vez mediante el elemento de referencia y se usa durante toda la vida útil del recurso. Por otro lado, DynamicResource se adquiere cada vez que se utiliza el objeto al que se hace referencia.

A continuación se detallan las principales diferencias entre los recursos estáticos y dynamics:

  1. El recurso estático evaluará el recurso solo una vez, mientras que el recurso dynamic se evaluará cada vez que se necesite el recurso.

2. El recurso dynamic tiene más sobrecarga de rendimiento que los recursos estáticos porque busca recursos cada vez que lo solicita o necesita.

3. El recurso estático es más rápido, pero lleva un poco más de tiempo cargar la página o ventana que el recurso dynamic porque los recursos dynamics se cargan cuando realmente los usa.

Los recursos dynamics solo se pueden usar cuando la propiedad que se está configurando está en el objeto que se deriva del objeto de dependencia o freezable, donde los recursos estáticos se pueden usar en cualquier lugar. Puede abstraer todo el control utilizando recursos estáticos.

Los recursos estáticos se utilizan en las siguientes circunstancias:

  1. Cuando los recursos de reacción cambian en el tiempo de ejecución no es necesario.
  2. Si necesita un buen rendimiento con muchos recursos.
  3. Al hacer referencia a los recursos dentro del mismo diccionario.

Recursos dynamics:

  1. El valor de la propiedad o el tema del setter de estilo no se conoce hasta el tiempo de ejecución
    • Esto incluye sistema, aplicación, configuración basada en temas
    • Esto también incluye referencias avanzadas.
  2. Hacer referencia a los recursos grandes que pueden no cargarse cuando se carga la página, las ventanas y el control del usuario.
  3. Hacer referencia a estilos de tema en un control personalizado.

Los recursos referidos estáticos evalúan el recurso solo una vez y luego si los recursos cambian, esos cambios no se reflejan en el enlace. Mientras que los recursos referidos dynamics se evalúan cada vez que se necesita el recurso.