Tuesday, October 11, 2011

Static vs Dynamic resources in WPF


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.

  1. 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”.
  2. Dynamic resource has more performance overhead than static resources because it look up for resources every time it requested or needed.
  3. 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.
  4. 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>
          The same is valid for dynamic resource
       <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 - 

3 comments:

  1. hi

    this helps me a lot in understanding difference between static and dynamic resource markup extension

    regards
    ramesh

    ReplyDelete
  2. Hi,
    From 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

    ReplyDelete