A resource can be referenced as either static or dynamic
resource. This can be done by using either Static resource markup extension or
Dynamic resource markup extension. You can go through my post on Markupextension in WPF for more information about markup extension.
- The major difference between static and dynamic resources is “static resource will evaluate the resource only once while dynamic resource will be evaluated every time the resource needed”.
- Dynamic resource has more performance overhead than static resources because it look up for resources every time it requested or needed.
- Static resource is faster but it takes little more time to load page or window than dynamic resource because dynamic resources are loaded when you actually used those.
- If resource is defined on the element’s resources and the same element property is using the resource defined inside its resources then static resource not applied because it should appears afterwards. The same thing is valid for dynamic resource. Let’s have a look on below code snippet.
Below code gives compile time error.
<Grid Background="{StaticResource lightBlueColor}">
<Grid.Resources>
<SolidColorBrush Color="LightBlue" x:Key="lightBlueColor"/>
</Grid.Resources>
</Grid>
<Grid Background="{DynamicResource lightBlueColor}">
<Grid.Resources>
<SolidColorBrush Color="LightBlue" x:Key="lightBlueColor"/>
</Grid.Resources>
</Grid>
Below example gives you clear picture about Static and
Dynamic resource markup extension.
XAML
<Window.Resources>
<SolidColorBrush Color="LightBlue" x:Key="buttonBackground"
/>
</Window.Resources>
<StackPanel Name="stkPanel">
<Button Name="Button1" Content="Button1"
Width="150" Height="40" Margin="5"
Background="{StaticResource buttonBackground}"/>
<Button Name="Button2" Content="Button2"
Width="150" Height="40" Margin="5"
Background="{DynamicResource buttonBackground}"/>
<Button Name="Button3" Content="Button3"
Width="150" Height="40" Margin="5"
Background="{StaticResource buttonBackground}"/>
</StackPanel>
Code behind
void
StaticAndDynamicResources_Loaded(object sender,
RoutedEventArgs e)
{
stkPanel.Resources["buttonBackground"]
= Brushes.Yellow;
}
Output
As shown in above example, three buttons are using
buttonBackground resource defined in windows.resources element. Button1 and
Button3 are using static resource markup extension while button2 is using
dynamic resource markup extension. After loading of my window, I have changed color of
buttonBackground resource from Lightblue to Yellow in code behind. So when I run my application, Button2 will have yellow background and rest of the buttons will have LightBlue
background. The reason behind for not changing background of Button1 and Button3 because both button uses static resource and static resource is loaded only once with application while button2 uses dynamic resource and it changes every time when it accessed.
Hope you liked this article. Please feel free to write feedback/comments in comment section below.
See also -
hi
ReplyDeletethis helps me a lot in understanding difference between static and dynamic resource markup extension
regards
ramesh
Hi,
ReplyDeleteFrom your write-up what I can understand is that the referencing object accesses the dynamic resource every time it's used.But I did not understand how it changed(the colour of button2) given the fact that the code to create the buttons executed only once.Is this beacause of dependency property or something like that?
Thanks in advance!
Subrata
thx ;)
ReplyDelete