无废话WPF系列16:资源

本文详细介绍了WPF中资源的四种定义方式:应用程序级资源、窗体级资源、文件级资源和对象级资源,并阐述了资源文件解析的顺序及静态资源与动态资源的区别。

在WPF中资源通常用作“样式”(Style)、样式模板、数据模板等。

一、资源的定义及使用

1. 应用程序级资源:

定义在App.xaml文件中,作为整个应用程序共享的资源

1
2
3
4
5
6
7
8
<Application x:Class="DeepXAML.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <SolidColorBrush Color="Red" x:Key="redBrush"></SolidColorBrush>
    </Application.Resources>
</Application>

使用应用程序集资源

1
2
3
4
5
6
7
8
9
10
<Window x:Class="DeepXAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DeepXAML"      
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="250" Width="450">  
    <StackPanel x:Name="stackPanel">
        <Button Background="{StaticResource ResourceKey=redBrush}">test app resource</Button>
    </StackPanel>
</Window>

2. 窗体级资源:定义在Window或Page中,作为一个窗体或页面共享的资源存在

1
2
3
4
5
6
7
8
9
10
11
12
13
<Window x:Class="DeepXAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DeepXAML"      
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="250" Width="450"> 
    <Window.Resources>
        <SolidColorBrush Color="Red" x:Key="redBrush"></SolidColorBrush>
    </Window.Resources>
    <StackPanel x:Name="stackPanel">
        <Button Background="{StaticResource ResourceKey=redBrush}">test app resource</Button>
    </StackPanel>
</Window>

 

3. 文件级资源:定义在资源字典的XAML文件中,再引用

在Visual Studio的WPF应用程序项目中,添加“资源字典(Resource Dictionary)”类型的项

1
2
3
4
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush Color="Red" x:Key="redBrush"></SolidColorBrush>
</ResourceDictionary>
1
2
3
4
5
6
7
8
9
10
11
12
13
<Window x:Class="DeepXAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DeepXAML"      
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="250" Width="450"> 
    <Window.Resources>
        <ResourceDictionary Source="Skin1.xaml"></ResourceDictionary>
    </Window.Resources>
    <StackPanel x:Name="stackPanel">
        <Button Background="{StaticResource ResourceKey=redBrush}">test app resource</Button>
    </StackPanel>
</Window>

4.对象(控件)级资源:定义在某个ContentControl中,作为其子容器、子控件共享的资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="DeepXAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DeepXAML"      
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="250" Width="450"> 
     <StackPanel x:Name="stackPanel">
        <StackPanel.Resources>
            <ResourceDictionary Source="Skin1.xaml"></ResourceDictionary>
        </StackPanel.Resources>
        <Button Background="{StaticResource ResourceKey=redBrush}">test app resource</Button>
    </StackPanel>
</Window>
 
二、资源文件解析的顺序
1
这个顺序和层叠样式表类似,优先级从高到底为:对象级,窗体级,应用程序集。静态资源(StaticResource)和动态资源(DynamicResource)

资源可以作为静态资源或动态资源进行引用。这是通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展完成的。

通常来说,不需要在运行时更改的资源使用静态资源;而需要在运行时更改的资源使用动态资源。动态资源需要使用的系统开销大于静态资源的系统开销。

 

三、静态资源(StaticResource)和动态资源(DynamicResource)

资源可以作为静态资源或动态资源进行引用。这是通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展完成的。

通常来说,不需要在运行时更改的资源使用静态资源;而需要在运行时更改的资源使用动态资源。动态资源需要使用的系统开销大于静态资源的系统开销。

Background="{DynamicResource redBrush}"
 
private void Button_Click(object sender, RoutedEventArgs e)
{
   SolidColorBrush brush = new SolidColorBrush(Colors.Green);
   this.Resources["redBrush"] = brush;

}

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966170.html如需转载请自行联系原作者


王德水

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值