StaticResource和WPF中的DynamicResource有什么区别?

在WPF中使用资源(如画笔,模板和样式)时,可以将它们指定为StaticResources

<Rectangle Fill="{StaticResource MyBrush}" />

或者作为一个DynamicResource

<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}"  />

大部分时间(总是?),只有一个有效,另一个会在运行时抛出异常。 但我想知道为什么:

  • 主要区别是什么? 像内存或性能影响
  • WPF中有像“画笔总是静态的”和“模板总是动态的”等规则吗?
  • 认为静态与动态之间的选择并不像看起来那么武断......但我看不到这种模式。


    在加载实际运行应用程序之前发生的XAML期间,StaticResource将被解析并分配给属性。 它只会被分配一次,并且任何对资源字典的更改都会被忽略。

    DynamicResource在加载过程中将一个Expression对象分配给该属性,但在Expression对象被要求输入值时才直接在运行时查找该资源。 这延迟查找资源,直到它在运行时需要。 一个很好的例子就是对后面在XAML中定义的资源的前向引用。 另一个例子是直到运行时才会存在的资源。 如果源资源字典发生更改,它将更新目标。


    我也对他们感到困惑。 看下面这个例子:

    <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>
    

    在这里,我使用了按钮和窗口的动态资源,并没有在任何地方声明它。在运行时,层次结构的ResourceDictionary将被检查。由于我没有定义它,所以我猜默认值会被使用。

    如果我添加下面的代码来点击Button的事件,因为他们使用DynamicResource,所以后台会相应地更新。

    private void ButtonNew_Click(object sender, RoutedEventArgs e)
    {
        this.Resources.Add(  "PinkBrush"
                             ,new SolidColorBrush(SystemColors.DesktopColor)
                           );
    }
    

    如果他们使用了StaticResource:

  • 资源必须在XAML中声明
  • 这也是“之前”他们使用。
  • 希望我澄清了一些混淆。


    StaticResource将在对象构造上解析。
    每当控制需要资源时,DynamicResource将被评估和解决。

    链接地址: http://www.djcxy.com/p/8901.html

    上一篇: What's the difference between StaticResource and DynamicResource in WPF?

    下一篇: C# Interfaces. Implicit implementation versus Explicit implementation