WPF资源

wpf资源

wpf资源系统是一种保管一系列有用对象的简单方法 从而更方便的使用这些对象

资源的优点 ,高效 :定义一个资源,可以在多处引用

维护方便 :修改一处即可,例如用户更换皮肤,字体等动作

wpf中每个元素都有Resource属性(FrameworkElement子类) ,该属性存储了一个资源字典,可以包含任意类型的对象,并根据字符串进行索引

 

wpf索引资源,

  1、从当前元素中寻找;

  2、父类容器中寻找;

  3、window顶级元素中查找;

  4、应用程序集中查找;

  、资源中查找

 

引用资源

  动态引用资源:当资源被改变的时候,引用该资源的对象会同步发生变化;

  通过xaml标记扩展语法 XX属性 = "{DynamicResource myBrush}"

  静态引用资源:程序启动时候加载该资源后,无论资源发生变化,程序不会发生变化

  通过xaml标记扩展语法 XX属性 = "{StaticResource myBrush}"

资源单例:

  正常情况都是初始化一个资源对象,然后在多处引用这个对象,当希望某处引用可以单独更改时,可以设置资源的创建模式 x:Shared = “False” 标识这个资源对象 为每一个引用单独创建对象

  该模式不建议使用

  注:VS2017 不提示这属性,手动输入后能正常通过编译运行

        <ImageBrush x:Key="TitleBrush" x:Shared="False"  TileMode="Tile" Viewport="0 0 32 32"
                    ImageSource="happyFace.jpg" ViewportUnits="Absolute" />

 

代码访问资源

资源被定义后相当于当前类的一个属性,可以通过 FrameworkElement.FindResource(参数为资源的key) 来进行查找资源 ,如果资源不存在则抛出异常 ; 建议使用 TryFindResource()方法进行查找 ;资源不存在返回空引用

MainWindow.xaml

<Window x:Class="WpfAppResource.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAppResource"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Name="mainWindow">
    <Window.Resources>
        <ImageBrush x:Key="TitleBrush" x:Shared="False"  TileMode="Tile" Viewport="0 0 32 32"
                    ImageSource="happyFace.jpg" ViewportUnits="Absolute" />
        <SolidColorBrush x:Key="windowBrush" Color="Blue"/>
        <SolidColorBrush x:Key="changeBrush" Color="Red"/>
    </Window.Resources>
    <Grid >
        <Button Background="{DynamicResource windowBrush}" Height="32"  Content="引用容器的资源" Margin="50,59,337,177" />
        <Button Name="btnChange"  Foreground="{x:Static SystemColors.WindowTextBrush}" Content="引用元素本身的资源" Height="32" Margin="50,138,337,150">
            <Button.Resources>
                <SolidColorBrush x:Key="ElementBrush" Color="Green"/>
            </Button.Resources>
            <Button.Background >
                <StaticResource  ResourceKey="ElementBrush"/>
            </Button.Background>
        </Button>
        <Button Background="{DynamicResource changeBrush}" Height="32"  Content="动态改变资源"  Click="btnChange_Click" Margin="50,192,337,96"/>
        <Button Background="{DynamicResource appBrush}" Height="32"  Content="引用程序集资源"  Click="btnChange_Click" Margin="50,246,337,42"/>
        
    </Grid>
</Window>

 

 App.Xaml

<Application x:Class="WpfAppResource.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfAppResource"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <SolidColorBrush x:Key="appBrush" Color="Orange"/>
    </Application.Resources>
</Application>

 

代码动态改变资源

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

namespace WpfAppResource
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnChange_Click(object sender, RoutedEventArgs e)
        {
            mainWindow.Resources["changeBrush"] = new SolidColorBrush(Colors.LightBlue);

        }
    }
}



 点击动态改变按钮之后

 

posted @ 2018-03-22 19:59  迷~途  阅读(159)  评论(0编辑  收藏  举报