文档章节

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

j
 javail
发布于 01/26 13:18
字数 1162
阅读 49
收藏 0

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

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

或者作为DynamicResource

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

大多数时候(总是?),只有一个工作,另一个将在运行时抛出异常。 但我想知道原因:

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

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


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

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

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楼

动态资源的重要好处

如果应用程序启动需要很长时间,则必须使用动态资源,因为静态资源总是在创建窗口或应用程序时加载,而动态资源在首次使用时会加载。

但是,除非您的资源非常庞大且复杂,否则您将看不到任何好处。

本文转载自:https://hi.sofbug.com/question/qFL

j
粉丝 5
博文 1123
码字总数 0
作品 0
深圳
私信 提问
WPFの静态资源(StaticResource)和动态资源(DynamicResource)

下面是前台代码:

andrewniu
2018/05/29
0
0
WPF实例秀——不用属性也Binding

WPF实例秀——不用属性也Binding 正文: 实际编程中,因为我们较多地使用到Binding类的Source与Path,所以可能会有一个思维定式,那就是:有可能作为数据源的类一定要准备好一些属性,这些属...

水之真谛
2008/12/16
0
0
第一部分:基础知识(第一章)标准的Silverlight文件

你可以在Visual Studio的中解决方案资源管理中查看加载的项目。你会看到两对骨架文件:App.xaml的和App.xaml.cs,和MainPage.xaml和MainPage.xaml.cs。App.xaml和MainPage.xaml是扩展应用程序...

彭博
2012/03/09
110
0
wpf教程-metro扁平化样式UI控件库推荐:MahApps.Metro

wpf虽然做出来的ui效果已经很好了,但是还是会有很多客户要求在完善。不如在win8出来后,很多用户就喜欢metro的样式。 今天给大家推荐metro扁平化样式UI控件库:MahApps.Metro 。 官方地址:...

Andrewniu
2018/10/23
0
0
WPF数据绑定(1-简单数据绑定)

小疯最近的项目组工作开发中需要用到WPF,所以最近在学习WPF,小疯对于WPF中的绑定比较迷糊,认为这里需要多注意。然后小疯在这里找到了一篇文章,转过来分享一下: 数据绑定就是将各种数据与...

野小疯
2018/06/07
2.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

天津哪里可以开建材发票-腾讯新闻网

天津哪里可以开建材发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridge,...

16534163966
14分钟前
13
0
北京哪里可以开海关缴款书发票-腾讯新闻网

北京哪里可以开海关缴款书发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug B...

15983684413
15分钟前
17
0
北京哪里可以开粮油发票-腾讯新闻网

北京哪里可以开粮油发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridge,...

16534163727
16分钟前
21
0
北京哪里可以开文化传播发票-腾讯新闻网

北京哪里可以开文化传播发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bri...

17035270196
18分钟前
27
0
北京哪里可以开电线电缆发票-腾讯新闻网

北京哪里可以开电线电缆发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bri...

15232501104
18分钟前
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部