zoukankan      html  css  js  c++  java
  • WPF 基础

    为了避免丢失和损坏,编译器允许我们把外部文件编译进程序主体、成为程序主体不可分割的一部分,这就是传统意义上的程序资源,即二进制资源;

    WPF 的四个等级资源:

    1. 数据库里的数据 (仓库)
    2. 资源文件 (行旅箱)
    3. 对象资源 (背包)
    4. 变量中的数据 (手中)

    1. 对象级的定义和查找

    <Window.Resources>
        <ResourceDictionary>
            ...
        </ResourceDictionary>
    </Window.Resources>
    

    视情况可以简写不写。

    <Window 
        ...
        xmlns:sys="clr-namespace:System;assembly=mscorlib">
        
    <Window.Resources>
        <sys:String x:Key="str">
            Hello, Wpf.
        </sys:String>
        <sys:Double x:Key="dbl">3.1415926</sys:Double>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{StaticResource ResourceKey=str}"/>
    </StackPanel>
    
    // C# 里面找资源,会一层一层往上找,直到 Application.Resources
    string text = (string)this.FindResource("str"); //找不到就抛出异常
    string text = (string)this.TryFindResource("str"); //找不到就返回 null
    
    // 如果已经明确资源放在哪,可以这样写:
    string text = (string)this.Resource["str"]; //找不到就返回 null
    

    2. 像 css 那样引用独立文件

    1. 新建独立文件 /Themes/Style.xaml
    <ResourceDictionary 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp1">
        ...
    </ResourceDictionary>
    
    1. 通过 ResourceDictionary 的 Source 属性指定要引用的独立文件
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Themes/Style.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    

    3. 动 or 静

    StaticResource 静态资源指在程序载入内存时对资源的一次性使用,之后不再去访问这个资源;

    DynamicResource 动态资源是指在程序运行过程中仍然会去访问资源;

    就像主题皮肤,如果不会变的,就用 StaticResource,如果程序运行过程中还要切换不同皮肤,就使用 DynamicResource。

    <Window.Resources>
        <TextBlock x:Key="tb1" Text="I am a textBlock"/>
    </Window.Resources>
    <StackPanel>
        <Button x:Name="btn1" Content="{StaticResource tb1}" />
        <Button x:Name="btn2" Content="{DynamicResource tb1}" />
    </StackPanel>
    
    ...
    
    void function(object sender, RoutedEventArgs e) 
    {
        this.Resources["tb1"] = new TextBlock() { Text = "I have changed" };   
    }
    

    执行 function 方法后,会看到 btn1 上的文字依旧是 "I am a textBlock", 而 btn2 按钮上的文字已变成 "I have changed"

    4. 二进制资源

    4.1 字符串

    4.1.1 注册
    • 应用程序 Properties 名称空间中的 Resources.resx 资源文件,跟 Settings.settings 类似采用键值对的方式;
    • 为了让 XAML 编译器能够访问这个类,一定要把 Resources.resx 的访问级别由 Internal 改为 Public;
    4.1.2 使用
    1. 定义举例:Properties.Resources.resx 下定义名称为 password 值为 passwd 的键值对;
    2. 调用举例:
    <Window 
        ...
        xmlns:prop="clr-namespace:WpfApp1.Properties">
        
        <StackPanel>
            <TextBlock Text="{x:Static prop:Resources.username}"/>
            <TextBlock x:Name="tb1"/>
        </StackPanel>
    </Window>
    
    this.tb1.Text = Properties.Resources.password;
    

    4.2 媒体资源

    直接将文件引入项目中;

    • 如果是想把文件编译进目标成为二进制资源,必须在窗口属性中把文件的 生成操作 属性值为 Resource,复制到输出目录 属性设为 不复制;
    • 如果想输出到生成的方案中,就把生成操作设置为 内容,复制到输出目录属性 设为 如果较新则复制,这种方式可以在生成方案之后客户端继续更换资源(如更换图片)。

    4.3 使用 Pack URI 路径访问二进制资源

    路径模板:

    • pack://application:,,,[/程序集名称;][可选版本号;][文件夹名称/]文件名称
    • pack://application:,,, 可以省略
      其中,程序集名称 可选版本号常使用缺省值。
    <!--下面三个指定 Source 的方式效果一样-->
    <Image x:Name="img1" Source="Images/2.jpg" Stretch="Fill" />
    <Image x:Name="img2" Source="/Images/2.jpg" Stretch="Fill" />
    <Image x:Name="img3" Source="pack://application:,,,/Images/2.png" Stretch="Fill" />
    

    等同于下列的后台代码:

    // {pack://application:,,,/WpfApp1;component/Images/2.png}
    this.img1.Source = new BitmapImage(new Uri("Images/2.png", UriKind.Relative));
    
    // {pack://application:,,,/Images/2.png}
    this.img2.Source = new BitmapImage(new Uri("/Images/2.png", UriKind.Relative));
    
    this.img3.Source = new BitmapImage(new Uri("pack://application:,,,/Images/2.png", UriKind.Absolute));
    

    其中 pack://application:,,, 开头表示绝对路径,需使用 UriKind.Absolute;
    缩略写法代表相对路径,UriKind 必须为 Relative,且代表根目录的 / 可以省略;
    使用相对路径时,可以借助 DOS 的语法进行导航,如 ./ 代表上一级 ../ 代表父级

  • 相关阅读:
    JavaScript之正则表达式
    BOM之本地数据存储
    BOM之定时器
    BOM之window核心模块
    BOM简介
    DOM之元素定位
    DOM之事件
    DOM之节点操作
    DOM简介
    linux机制
  • 原文地址:https://www.cnblogs.com/MichaelLoveSna/p/14447784.html
Copyright © 2011-2022 走看看