What's the difference between StaticResource and DynamicResource in WPF?

前端 未结 8 2023
长发绾君心
长发绾君心 2020-11-22 12:33

When using resources such as brushes, templates and styles in WPF, they can be specified either as StaticResources



        
相关标签:
8条回答
  • 2020-11-22 13:25
    1. StaticResource uses first value. DynamicResource uses last value.
    2. DynamicResource can be used for nested styling, StaticResource cannot.

    Suppose you have this nested Style dictionary. LightGreen is at the root level while Pink is nested inside a 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>
    

    In view:

    <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 will render the button as LightGreen, the first value it found in the style. DynamicResource will override the LightGreen button as Pink as it renders the Grid.

    StaticResource StaticResource

    DynamicResource DynamicResource

    Keep in mind that VS Designer treats DynamicResource as StaticResource. It will get first value. In this case, VS Designer will render the button as LightGreen although it actually ends up as Pink.

    StaticResource will throw an error when the root-level style (LightGreen) is removed.

    0 讨论(0)
  • 2020-11-22 13:30

    What is the main difference. Like memory or performance implications

    The difference between static and dynamic resources comes when the underlying object changes. If your Brush defined in the Resources collection were accessed in code and set to a different object instance, Rectangle will not detect this change.

    Static Resources retrieved once by referencing element and used for the lifetime of the resources. Whereas, DynamicResources retrieve every time they are used.

    The downside of Dynamic resources is that they tend to decrease application performance.

    Are there rules in WPF like "brushes are always static" and "templates are always dynamic" etc.?

    The best practice is to use Static Resources unless there is a specific reason like you want to change resource in the code behind dynamically. Another example of instance in which you would want t to use dynamic resoruces include when you use the SystemBrushes, SystenFonts and System Parameters.

    0 讨论(0)
提交回复
热议问题