[.net] StaticResource和WPF中的DynamicResource有什麼區別?



5 Answers

我也對他們感到困惑。 看下面這個例子:

<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中聲明
  • 這也是“之前”他們使用。

希望我澄清了一些混淆。

Question

在WPF中使用資源(如畫筆,模板和样式)時,可以將它們指定為StaticResources

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

或者作為一個DynamicResource

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

大部分時間(總是?),只有一個有效,另一個會在運行時拋出異常。 但我想知道為什麼:

  • 主要區別是什麼? 像內存或性能影響
  • WPF中有像“畫筆總是靜態的”和“模板總是動態的”等規則嗎?

認為靜態與動態之間的選擇並不像看起來那麼武斷......但我看不到這種模式。




邏輯資源允許您在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的顏色屬性在代碼中更改為橙色和粉紅色,那麼只有當資源用作DynamicResource時,它才會反映在元素上。 以下是更改代碼中資源的代碼:

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

DynamicResource的缺點是它會降低應用程序性能,因為每次使用資源時都會檢索它們。 最好的做法是靜態資源使用,直到有一個特定的原因使用DynamicResource。

資源:
WPF:StaticResource與DynamicResource




靜態引用資源僅對資源進行一次評估,如果資源發生更改,則這些更改不會反映在綁定中。 每次需要資源時都會評估動態引用資源。




主要區別是什麼? 像內存或性能影響

當底層對象發生變化時,靜態資源和動態資源的區別就在於此。 如果在資源集合中定義的Brush在代碼中訪問並設置為不同的對象實例,則Rectangle不會檢測到此更改。

靜態資源通過引用元素檢索一次,並用於資源的生命週期。 而DynamicResources在每次使用時都會檢索。

動態資源的缺點是它們傾向於降低應用程序的性能。

WPF中有像“畫筆總是靜態的”和“模板總是動態的”等規則嗎?

最好的做法是使用靜態資源,除非有特定的原因,比如你想動態改變代碼中的資源。 您希望使用動態資源的另一個示例包括使用SystemBrushes,SystenFonts和System Parameters時的情況。




以下是靜態和動態資源的主要區別:

  1. 靜態資源只會評估一次資源,而每次資源需要時都會評估動態資源。

2.動態資源比靜態資源具有更多的性能開銷,因為它每次請求或需要時都會查找資源。

3.靜態資源速度更快,但加載頁面或窗口所需的時間比動態資源更少,因為實際使用動態資源時會加載動態資源。




動態資源的重要好處

如果應用程序啟動需要很長時間,則必須使用動態資源,因為靜態資源始終在創建窗口或應用程序時加載,而動態資源在首次使用時加載。

但是,除非您的資源非常龐大且複雜,否則您將看不到任何好處。




Related