Al utilizar recursos como pinceles, plantillas y estilos en WPF, se pueden especificar como recursos estáticos
<Rectangle Fill="{StaticResource MyBrush}" />
o como un DynamicResource
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
La mayoría de las veces (¿siempre?), Solo una funciona y la otra generará una excepción durante el tiempo de ejecución. Pero me gustaría saber por qué:
- Cual es la diferencia principal. Como memoria o implicaciones de rendimiento
- ¿Existen reglas en WPF como "los pinceles son siempre estáticos" y "las plantillas son siempre dinámicas", etc.?
Yo asumo la elección entre estático vs dinámico no es tan arbitraria como parece ... pero no puedo ver el patrón.
Respuestas:
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 cualquier cambio en el diccionario de recursos se ignorará.
Un DynamicResource asigna un objeto de expresión a la propiedad durante la carga pero en realidad no buscar el recurso hasta el tiempo de ejecución cuando se le pide al objeto de expresión para el valor. Esto difiere buscando el 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. Se actualizará el destino si se cambia el diccionario de recursos de origen.
fuente
It will update the target if the source resource dictionary is changed.
También estaba confundido acerca de ellos. Vea este ejemplo a continuación:
Aquí he usado recursos dinámicos para botones y ventanas y no los he declarado en ninguna parte. En tiempo de ejecución, se verificará el ResourceDictionary de la jerarquía. Dado que no lo he definido, supongo que se usará el valor predeterminado.
Si agrego el código a continuación para hacer clic en el evento del botón, ya que usan DynamicResource, el fondo se actualizará en consecuencia.
Si hubieran usado StaticResource:
Espero haber aclarado alguna confusión.
fuente
StaticResource se resolverá en la construcción del objeto.
DynamicResource será evaluado y resuelto cada vez que el control necesite el recurso.
fuente
Supongamos que tiene este diccionario de estilo anidado. LightGreen está en el nivel raíz mientras que Pink está anidado dentro de una cuadrícula.
En vista:
StaticResource representará el botón como LightGreen, el primer valor que encontró en el estilo. DynamicResource anulará el botón LightGreen como Pink cuando represente la Grid.
StaticResource
DynamicResource
Tenga en cuenta que VS Designer trata DynamicResource como StaticResource. Obtendrá el primer valor. En este caso, VS Designer representará el botón como LightGreen aunque en realidad termine en Pink.
StaticResource arrojará un error cuando se elimine el estilo de nivel raíz (LightGreen).
fuente
Cual es la diferencia principal. Como memoria o implicaciones de rendimiento
La diferencia entre los recursos estáticos y dinámicos se produce cuando cambia el objeto subyacente. Si se accedió a su Pincel definido en la colección de Recursos en código y se estableció en una instancia de objeto diferente, Rectángulo no detectará este cambio.
Recursos estáticos recuperados una vez por elemento de referencia y utilizados durante la vida útil de los recursos. Mientras que, DynamicResources recupera cada vez que se utilizan.
La desventaja de los recursos dinámicos es que tienden a disminuir el rendimiento de la aplicación.
¿Existen reglas en WPF como "los pinceles son siempre estáticos" y "las plantillas son siempre dinámicas", etc.?
La mejor práctica es utilizar recursos estáticos a menos que exista una razón específica como que desee cambiar los recursos en el código de forma dinámica. Otro ejemplo de instancia en la que desearía utilizar recursos dinámicos incluye cuando utiliza SystemBrushes, SystenFonts y System Parameters.
fuente
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 alojará este control de usuario) al referirse a ese recurso como DynamicResource.
Como han mencionado otros, se buscará Staticresource en tiempo de compilación. Los controles de usuario no pueden referirse a los recursos que se definen en el control de alojamiento / padre. Sin embargo, DynamicResource podría usarse en este caso.
fuente
Beneficio importante de los recursos dinámicos.
Si el inicio de la aplicación lleva mucho tiempo, debe usar recursos dinámicos, porque los recursos estáticos siempre se cargan cuando se crea la ventana o la aplicación, mientras que los recursos dinámicos 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.
fuente
Los recursos dinámicos solo se pueden usar cuando la propiedad que se establece está en un objeto derivado de un objeto de dependencia o congelable, 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:
Recursos dinámicos:
fuente