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

在WPF中使用画笔,模板和样式等资源时,能够将它们指定为StaticResources 性能

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

或者做为DynamicResource this

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

大多数时候(老是?),只有一个工做,另外一个将在运行时抛出异常。 但我想知道缘由: spa

  • 主要区别是什么? 像记忆或性能影响
  • WPF中的规则是“画笔老是静态的”和“模板老是动态的”等吗?

假设静态与动态之间的选择并不像看起来那么随意......但我没有看到模式。 code


#1楼

逻辑资源容许您在XAML中定义对象,这些对象不是可视树的一部分,但能够在您的用户界面中使用。 逻辑资源的一个示例是Brush,它用于提供颜色方案。 一般,这些对象被定义为资源,这些资源由应用程序的多个元素使用。 对象

<Window.Resources>
    <RadialGradientBrush x:Key="myGradientBrush">
        <GradientStop Color="Green" Offset="0"/>
        <GradientStop Color="Blue" Offset="2"/>
    </RadialGradientBrush>
</Window.Resources>

如今,上面声明的资源能够用做静态或动态资源。 须要记住的一点是,在使用静态资源时,应首先在XAML代码中定义它,而后才能引用它。 静态和动态资源可用做: 生命周期

<Grid Background="{StaticResource myGradientBrush}"></Grid>

要么: 资源

<Grid Background="{DynamicResource myGradientBrush}"></Grid>

StaticResource和DynamicResource之间的区别在于引用元素如何检索资源。 StaticResource仅由引用元素检索一次,并用于资源的整个生命周期。 另外一方面,每次使用引用的对象时都会获取DynamicResource。 get

换句话说,若是RadialGradientBrush的color属性在代码中更改成Orange和Pink,那么只有在将资源用做DynamicResource时才会反映元素。 下面是代码中更改资源的代码: io

RadialGradientBrush radialGradientBrush =
    new RadialGradientBrush(Colors.Orange, Colors.Pink);
this.Resources["myGradientBrush"] = radialGradientBrush;

DynamicResource的缺点是它下降了应用程序性能,由于每次使用时都会检索资源。 最好的作法是使用StaticResource,直到有特定缘由使用DynamicResource。 编译

资源:
WPF:StaticResource与DynamicResource


#2楼

主要区别是什么? 像记忆或性能影响

当底层对象发生变化时,会出现静态和动态资源之间的差别。 若是在Resources集合中定义的Brush在代码中被访问并设置为不一样的对象实例,则Rectangle将不会检测到此更改。

静态资源经过引用元素检索一次,并用于资源的生命周期。 然而,DynamicResources每次使用时都会检索它们。

动态资源的缺点是它们每每会下降应用程序性能。

WPF中的规则是“画笔老是静态的”和“模板老是动态的”等吗?

最佳作法是使用静态资源,除非有特定缘由要求您动态更改代码中的资源。 您但愿使用动态资源的实例的另外一个示例包括使用SystemBrushes,SystenFonts和System Parameters时。


#3楼

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

DynamicResource在加载期间将一个Expression对象分配给该属性,但在运行时要求Expression对象输入值时,它实际上不会查找资源。 这会延迟查找资源,直到在运行时须要它为止。 一个很好的例子是对稍后在XAML中定义的资源的前向引用。 另外一个例子是直到运行时才会存在的资源。 若是源资源字典已更改,它将更新目标。


#4楼

发现全部答案都颇有用,只想添加一个用例。

在复合WPF方案中,您的用户控件能够经过将该资源称为DynamicResource来利用在任何其余父窗口/控件(即将承载此用户控件)中定义的资源。

正如其余人所提到的,Staticresource将在编译时查找。 用户控件不能引用托管/父控件中定义的那些资源。 虽然,在这种状况下能够使用DynamicResource。


#5楼

动态资源的重要好处

若是应用程序启动须要很长时间,则必须使用动态资源,由于静态资源老是在建立窗口或应用程序时加载,而动态资源在首次使用时会加载。

可是,除非您的资源很是庞大且复杂,不然您将看不到任何好处。

相关文章
相关标签/搜索