.net - ¿Cuál es la diferencia entre StaticResource y DynamicResource en WPF?
xaml resources (12)
- StaticResource utiliza el primer valor. DynamicResource utiliza el último valor.
- DynamicResource puede usarse para estilos anidados, StaticResource no puede.
Supongamos que tiene este diccionario de estilo anidado. LightGreen está en el nivel raíz, mientras que Pink está anidado dentro de una Grid.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Grid}">
<Style.Resources>
<Style TargetType="{x:Type Button}" x:Key="ConflictButton">
<Setter Property="Background" Value="Pink"/>
</Style>
</Style.Resources>
</Style>
<Style TargetType="{x:Type Button}" x:Key="ConflictButton">
<Setter Property="Background" Value="LightGreen"/>
</Style>
</ResourceDictionary>
En vista:
<Window x:Class="WpfStyleDemo.ConflictingStyleWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ConflictingStyleWindow" Height="100" Width="100">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/ConflictingStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Button Style="{DynamicResource ConflictButton}" Content="Test"/>
</Grid>
</Window>
StaticResource renderizará el botón como LightGreen, el primer valor que encontró en el estilo. DynamicResource anulará el botón LightGreen como rosa cuando muestre la cuadrícula.
StaticResource
DynamicResource
Tenga en cuenta que VS Designer trata a DynamicResource como StaticResource. Obtendrá primer valor. En este caso, VS Designer renderizará el botón como LightGreen aunque en realidad termine como Pink.
StaticResource generará un error cuando se elimine el estilo de nivel raíz (LightGreen).
Cuando se utilizan recursos como pinceles, plantillas y estilos en WPF, se pueden especificar como StaticResources
<Rectangle Fill="{StaticResource MyBrush}" />
o como un recurso dinámico
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
La mayoría de las veces (¿siempre?), Solo una funciona y la otra arrojará una excepción durante el tiempo de ejecución. Pero me gustaría saber por qué:
- Cual es la diferencia principal. Al igual que la memoria o las implicaciones de 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 y Dinámico no es tan arbitraria como parece ... pero no veo el patrón.
Encontré todas las respuestas útiles, solo quería agregar un caso de uso más.
En un escenario WPF compuesto, 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) refiriéndose a ese recurso como DynamicResource.
Como lo mencionaron otros, Staticresource se buscará en tiempo de compilación. Los controles de usuario no pueden referirse a aquellos recursos que se definen en el control de alojamiento / control principal. Aunque, DynamicResource podría ser utilizado en este caso.
Importante beneficio 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 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.
La diferencia entre StaticResource y DynamicResource reside en la forma en que los elementos de referencia recuperan los recursos. StaticResource se recupera una sola vez por el elemento de referencia y se utiliza durante toda la vida del recurso. Por otro lado, DynamicResource se adquiere cada vez que se utiliza el objeto referenciado.
Las siguientes son las principales diferencias entre los recursos estáticos y dinámicos:
- El recurso estático evaluará el recurso solo una vez, mientras que el recurso dinámico se evaluará cada vez que el recurso sea necesario.
2. El recurso dinámico tiene más sobrecarga de rendimiento que los recursos estáticos porque busca recursos cada vez que lo solicita o lo necesita.
3. El recurso estático es más rápido, pero lleva poco más tiempo cargar la página o la ventana que el recurso dinámico porque los recursos dinámicos se cargan cuando realmente los utiliza.
Los recursos lógicos le permiten definir objetos en XAML, que no forman 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.
<Window.Resources>
<RadialGradientBrush x:Key="myGradientBrush">
<GradientStop Color="Green" Offset="0"/>
<GradientStop Color="Blue" Offset="2"/>
</RadialGradientBrush>
</Window.Resources>
Ahora, el recurso declarado arriba podría usarse como recurso estático o dinámico. Un punto a recordar es que, cuando se usan recursos estáticos, primero debe definirse en el código XAML, antes de poder remitirlo. Los recursos estáticos y dinámicos se pueden utilizar como:
<Grid Background="{StaticResource myGradientBrush}"></Grid>
o:
<Grid Background="{DynamicResource myGradientBrush}"></Grid>
La diferencia entre StaticResource y DynamicResource reside en la forma en que los elementos de referencia recuperan los recursos. StaticResource se recupera una sola vez por el elemento de referencia y se utiliza durante toda la vida del recurso. Por otro lado, DynamicResource se adquiere cada vez que se utiliza el objeto referenciado.
Poniéndolo de una manera más simple, si la propiedad de color de RadialGradientBrush se cambia en 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 usan. La mejor práctica es usar StaticResource hasta que haya una razón específica para usar DynamicResource.
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 dinámicos se evalúan cada vez que se necesita el recurso.
StaticResource se resolverá en la construcción del objeto.
DynamicResource se evaluará y resolverá cada vez que el control necesite el recurso.
También estaba confundido acerca de ellos. Vea este ejemplo a continuación:
<Window x:Class="WpfApplicationWPF.CommandsWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CommandsWindow" Height="300" Width="300">
<StackPanel>
<Button Name="ButtonNew"
Click="ButtonNew_Click"
Background="{DynamicResource PinkBrush}">NEW</Button>
<Image Name="ImageNew"
Source="pack://application:,,,/images/winter.jpg"></Image>
</StackPanel>
<Window.Background>
<DynamicResource ResourceKey="PinkBrush"></DynamicResource>
</Window.Background>
</Window>
Aquí he utilizado el recurso dinámico para el botón y la ventana y no lo he declarado en ningún lugar. Durante el tiempo de ejecución, se comprobará el ResourceDictionary de la jerarquía. Ya que no lo he definido, creo que se utilizará el valor 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 utilizado StaticResource:
- El recurso debe ser declarado en XAML.
- Y eso también "antes" se usan.
Espero haber aclarado un poco de confusión.
Un StaticResource se resolverá y se asignará a la propiedad durante la carga del XAML que se produce 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 de expresión 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 de expresión. Esto difiere en buscar el recurso hasta que sea necesario en el tiempo de ejecución. Un buen ejemplo sería una referencia a un recurso definido más adelante en el XAML. Otro ejemplo es un recurso que ni siquiera existirá hasta el tiempo de ejecución. Se actualizará el objetivo si se cambia el diccionario de recursos de origen.
Cual es la diferencia principal. Al igual que la memoria o las implicaciones de rendimiento
La diferencia entre 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 el código y se estableció en una instancia de objeto diferente, el 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.
¿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 los recursos estáticos a menos que haya una razón específica como la que quiere cambiar los recursos en el código que se encuentra detrás de forma dinámica. Otro ejemplo de ejemplo en el que querría usar recursos dinámicos incluye cuando usa SystemBrushes, SystenFonts y System Parameters.
Los recursos dinámicos solo se pueden usar cuando la propiedad que se establece está en un objeto que se deriva de un objeto de dependencia o se puede congelar donde los recursos estáticos se pueden usar en cualquier lugar. Puedes abstraer todo el control usando recursos estáticos.
Los recursos estáticos se utilizan en las siguientes circunstancias:
- Cuando los recursos de reacción cambian en tiempo de ejecución no es necesario.
- Si necesitas un buen rendimiento con muchos recursos.
- Al hacer referencia a recursos dentro del mismo diccionario.
Recursos dinámicos:
- El valor del tema de establecimiento de propiedad o estilo no se conoce hasta el tiempo de ejecución
- Esto incluye el sistema, la aplicación, la configuración basada en temas
- Esto también incluye referencias hacia adelante.
- Hacer referencia a recursos grandes que pueden no cargarse cuando se cargan páginas, ventanas y controles de usuario.
- Referencia a estilos de temas en un control personalizado.