StaticResource和WPF中的DynamicResource有什么区别?
在WPF中使用资源(如画笔,模板和样式)时,可以将它们指定为StaticResources
<Rectangle Fill="{StaticResource MyBrush}" />
或者作为一个DynamicResource
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
大部分时间(总是?),只有一个有效,另一个会在运行时抛出异常。 但我想知道为什么:
我认为静态与动态之间的选择并不像看起来那么武断......但我看不到这种模式。
在加载实际运行应用程序之前发生的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:
希望我澄清了一些混淆。
StaticResource将在对象构造上解析。
每当控制需要资源时,DynamicResource将被评估和解决。
上一篇: What's the difference between StaticResource and DynamicResource in WPF?
下一篇: C# Interfaces. Implicit implementation versus Explicit implementation