StaticResource 与 DynamicResource

在WPF中,StaticResourceDynamicResource 用于资源的定义和使用,它们在资源解析和更新的方式上有所不同。

StaticResource

定义StaticResource 是在编译时解析资源,并在控件使用时获取资源的引用。资源在解析后不会再动态更新。

用法:适用于不需要动态更新的资源,性能较好。

实例

1,定义资源字典(例如,Colors.xaml):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Color x:Key="ApplicationBackgroundColor">#1e1c1c</Color>
    <SolidColorBrush x:Key="ApplicationBackgroundBrush" Color="{StaticResource ApplicationBackgroundColor}" />
</ResourceDictionary>

2,在 App.xaml 中引用资源字典: 

<Application x:Class="YourNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Colors.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

3,在 MainWindow.xaml 中使用 StaticResource: 

<Window x:Class="YourNamespace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800"
        Background="{StaticResource ApplicationBackgroundBrush}">
    <Grid>
        <TextBlock Text="Hello, World!" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

DynamicResource

定义DynamicResource 是在运行时解析资源,控件在使用时会在资源字典中查找资源引用。当资源在运行时发生变化时,使用该资源的控件会自动更新以反映资源的变化。

用法:适用于需要在运行时动态更新的资源,性能稍差但提供了动态资源更新的能力。

实例

1,定义资源字典(例如,Colors.xaml):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Color x:Key="ApplicationBackgroundColor">#1e1c1c</Color>
    <SolidColorBrush x:Key="ApplicationBackgroundBrush" Color="{DynamicResource ApplicationBackgroundColor}" />
</ResourceDictionary>

2,在 App.xaml 中引用资源字典

<Application x:Class="YourNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Colors.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

3,在 MainWindow.xaml 中使用 DynamicResource

<Window x:Class="YourNamespace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800"
        Background="{DynamicResource ApplicationBackgroundBrush}">
    <Grid>
        <TextBlock Text="Hello, World!" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

4,在代码中动态更新资源

using System.Windows;
using System.Windows.Media;

namespace YourNamespace
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            ChangeBackgroundColor();
        }

        private void ChangeBackgroundColor()
        {
            // 更新资源字典中的颜色
            Application.Current.Resources["ApplicationBackgroundColor"] = Color.FromRgb(34, 139, 34); // 绿色
        }
    }
}

StaticResources的适用场合:
(1)在资源第一次引用之后无需再修改资源的值。
(2)资源引用不会基于运行时的行为进行重新计算,比如在重新加载Page/Window的时候。
(3)当需要设置的属性不是DependencyObject或Freezable类型的时候,用StaticResource。
(4)当需要将资源编译到dll中,并打包为程序的一部份,或者希望在各应用程序之间共享时,也使用StaticResource。
(5)当需要为一个自定义控件创建一个Theme,并Theme中使用资源,就需要使用StaticResource。因为StaticResource的资源查找行为时可预测的,并且本身包含在Theme中。而对于DynamicResource,即使资源是定义在Theme中,也只能等到运行时确定,导致一些可能意料不到的情况发生。
(6)当需要使用资源设置大量的依赖属性(Dependency Property)的时候。
由于依赖属性具有属性系统提供的值缓存机制,所以,如果能在程序装载时设置依赖属性的值,这样,依赖属性就不需要检查自己的值并返回最后的有效值了。

Dynamic Resource的适用场合:
(1)资源的值依赖一些条件,而该条件直到运行时才能确定。
包括系统资源,或是用户可设置的资源。比如:可以创建引用系统属性诸如SystemColors,SystemFonts来设置值,而这些属性是动态的,它们的值又来自于运行环境和操作系统。
(2)为自定义控件引用或创建Theme Style。
(3)希望在程序运行期间调整资源字典的内容时。
(4)希望资源可以向前引用时(如上面在Canvas中引用innerLgbResource一样)
(5)资源文件很大,希望在运行时才加载。
(6)要创建的Style的值可能来自于其它值,而这些值又依赖于Theme或用户的设置。
(7)当引用资源的元素的父元素有可能在运行期改变,这个时候也需要使用动态资源。因为父元素的改变将导致资源查询的范围。
Dynamic resource的限制条件:属性必须是依赖属性,或是Freezable的。

### 回答1: DynamicResourceStaticResourceWPF中的两种资源引用方式。 StaticResource是静态资源引用方式,一旦被引用,其值就不再改变。StaticResource可以用于所有可用的资源类型,包括Brush、Style、DataTemplate等。 DynamicResource是动态资源引用方式,其值可以随时改变,而不需要重新加载应用程序。DynamicResource通常用于依赖于某些外部条件而变化的资源,例如主题、语言、字体大小等。 使用这两种资源引用方式的语法类似,只需要使用不同的关键字即可。例如,使用StaticResource引用资源的语法为{StaticResource ResourceKey},而使用DynamicResource引用资源的语法为{DynamicResource ResourceKey}。 ### 回答2: DynamicResourceStaticResourceWPF(Windows Presentation Foundation)中两种不同的资源引用方式。 StaticResource 是一种静态资源引用方式,它在应用程序启动时就会加载并解析资源,然后将其绑定到相应的控件上。在运行时,如果该资源发生了修改,它不会自动更新,只能手动重新加载。 DynamicResource 是一种动态资源引用方式,它在应用程序运行时才会加载并解析资源。与 StaticResource 不同的是,DynamicResource 在运行时会保持对资源的动态引用,使得如果该资源发生了修改,它能够自动更新并重新加载。这使得 DynamicResource 可以实现动态的样式变化、主题切换等效果。 通过动态资源引用,我们可以实现更加灵活的界面设计。比如,当我们希望在不同主题下切换应用程序的样式时,可以使用 DynamicResource 引用不同的样式资源,而无需修改控件的代码逻辑。只需修改主题资源文件,并让应用程序重新加载资源,就能够实现主题的切换。 需要注意的是,DynamicResource 的解析效率相对较低,因为它需要在运行时进行解析和重新加载资源。而 StaticResource 的解析效率较高,因为它在应用程序启动时就已经加载并解析了资源。因此,在性能要求较高的情况下,应该优先考虑使用 StaticResource。 ### 回答3: DynamicResourceStaticResource是用于在WPF应用程序中引用资源的两个不同的方式。 StaticResource是在XAML中使用的一种静态引用资源的方法。当使用StaticResource引用资源时,资源会在应用程序启动时被解析和加载,并且在运行时不会发生改变。这意味着无论资源的值如何改变,使用StaticResource引用的控件都将保持初始的资源值。StaticResource适用于那些不需要在运行时更改的资源。 DynamicResource则是一种动态引用资源的方式。与StaticResource不同,DynamicResource引用的资源在运行时可以随时更改,因此控件会自动更新以反映最新的资源值。这使得DynamicResource适用于那些可能需要根据用户输入或应用程序状态更改的资源。由于DynamicResource是动态解析资源,因此它的性能可能会稍微差一些。 在使用DynamicResourceStaticResource时需要注意,由于DynamicResource是在运行时解析,因此它不能在某些场景下使用,例如在控件的样式中或构造函数中。另外,DynamicResource只能用于依赖属性,而不能用于CLR属性。 总的来说,DynamicResourceStaticResource提供了在WPF应用程序中引用资源的不同方式,StaticResource适用于那些不需要在运行时更改的资源,而DynamicResource则适用于那些可能需要随时更新的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值