在WPF中使用畫筆,模板和樣式等資源時,能夠將它們指定爲StaticResources 性能
<Rectangle Fill="{StaticResource MyBrush}" />
或者做爲DynamicResource this
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
大多數時候(老是?),只有一個工做,另外一個將在運行時拋出異常。 但我想知道緣由: spa
我假設靜態與動態之間的選擇並不像看起來那麼隨意......但我沒有看到模式。 code
邏輯資源容許您在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
主要區別是什麼? 像記憶或性能影響
當底層對象發生變化時,會出現靜態和動態資源之間的差別。 若是在Resources集合中定義的Brush在代碼中被訪問並設置爲不一樣的對象實例,則Rectangle將不會檢測到此更改。
靜態資源經過引用元素檢索一次,並用於資源的生命週期。 然而,DynamicResources每次使用時都會檢索它們。
動態資源的缺點是它們每每會下降應用程序性能。
WPF中的規則是「畫筆老是靜態的」和「模板老是動態的」等嗎?
最佳作法是使用靜態資源,除非有特定緣由要求您動態更改代碼中的資源。 您但願使用動態資源的實例的另外一個示例包括使用SystemBrushes,SystenFonts和System Parameters時。
在加載實際運行應用程序以前發生的XAML期間,將解析StaticResource並將其分配給屬性。 它只會被分配一次,而且忽略對資源字典的任何更改。
DynamicResource在加載期間將一個Expression對象分配給該屬性,但在運行時要求Expression對象輸入值時,它實際上不會查找資源。 這會延遲查找資源,直到在運行時須要它爲止。 一個很好的例子是對稍後在XAML中定義的資源的前向引用。 另外一個例子是直到運行時纔會存在的資源。 若是源資源字典已更改,它將更新目標。
發現全部答案都頗有用,只想添加一個用例。
在複合WPF方案中,您的用戶控件能夠經過將該資源稱爲DynamicResource來利用在任何其餘父窗口/控件(即將承載此用戶控件)中定義的資源。
正如其餘人所提到的,Staticresource將在編譯時查找。 用戶控件不能引用託管/父控件中定義的那些資源。 雖然,在這種狀況下能夠使用DynamicResource。
動態資源的重要好處
若是應用程序啓動須要很長時間,則必須使用動態資源,由於靜態資源老是在建立窗口或應用程序時加載,而動態資源在首次使用時會加載。
可是,除非您的資源很是龐大且複雜,不然您將看不到任何好處。