[源码下载]

背水一战 Windows 10 (10) - 资源: StaticResource, ThemeResource

作者:webabcd

介绍
背水一战 Windows 10 之 资源

  • StaticResource
  • ThemeResource

示例
1、演示“StaticResource”相关知识点
Resource/StaticResourceDemo.xaml

<Page
x:Class="Windows10.Resource.StaticResourceDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Resource"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" xmlns:common="using:Windows10.Common"> <!--
定义各种类型的 StaticResource(Resources 属性来自 FrameworkElement)
系统会在加载 xaml 的时候去查找并应用 StaticResource 指定的资源
StaticResource 需要先定义后引用,比如如果把下面这段 Page.Resources 代码放到 Grid 后面去定义,那么就会报错
-->
<Page.Resources>
<x:String x:Key="MyString">StaticResource 经常用于指定 Style 或 ControlTemplate 资源,参见 /Controls/UI 部分</x:String>
<x:Double x:Key="MyDouble1">24</x:Double>
<x:Double x:Key="MyDouble2">48</x:Double>
<Thickness x:Key="MyThickness">20,20,20,20</Thickness>
<common:Employee x:Key="CurrentEmployee" Name="wanglei" Age="35" IsMale="True"></common:Employee> <!--静态资源也可以用来定义控件-->
<Flyout x:Key="MyFlyout">
<StackPanel>
<TextBlock Text="我是 Flyout 中的内容" />
</StackPanel>
</Flyout>
</Page.Resources> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <!--
下面演示 StaticResource 的使用方法
--> <!--
StaticResource 的 3 种引用方式
-->
<TextBlock Name="textBlock0" Margin="5" Text="{StaticResource MyString}" />
<TextBlock Name="textBlock1" Margin="5" Text="{StaticResource ResourceKey=MyString}" />
<TextBlock Name="textBlock2" Margin="5">
<TextBlock.Text>
<StaticResource ResourceKey="MyString" />
</TextBlock.Text>
</TextBlock> <TextBlock Name="textBlock3" Margin="5" FontSize="{StaticResource MyDouble1}" Text="我是 TextBlock">
<!--
Style 或 ControlTemplate 内都可以引用静态资源
-->
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="{StaticResource MyThickness}" />
</Style>
</TextBlock.Style>
</TextBlock> <!--
动态改变引用的资源
-->
<Button Name="btnChangeStaticResource" Content="改变引用的 StaticResource" Margin="5" Click="btnChangeStaticResource_Click" /> <!--
设置 FrameworkElement 的 DataContext 为一个指定的静态资源
-->
<TextBlock Margin="5" DataContext="{StaticResource CurrentEmployee}" Text="{Binding Name}" />
<TextBlock Margin="5" DataContext="{StaticResource CurrentEmployee}" Text="{Binding Age}" />
<TextBlock Margin="5" DataContext="{StaticResource CurrentEmployee}" Text="{Binding IsMale}" /> <!--
引用指定的静态资源(此静态资源是一个控件)
-->
<Button Margin="5" Content="按我弹出 Flyout" Flyout="{StaticResource MyFlyout}" /> <!--
如果一个 FrameworkElement 要引用内部 Resources 的话,像下面这么写是会报错的,因为资源被先引用后定义了
-->
<!--
<TextBlock Margin="5" Text="我是 TextBlock" Foreground="{StaticResource MyTextBlockForeground}">
<TextBlock.Resources>
<SolidColorBrush x:Key="MyTextBlockForeground" Color="Red" />
</TextBlock.Resources>
</TextBlock>
--> <!--
如果一个 FrameworkElement 要引用内部 Resources 的话,需要像下面这么写(资源先定义后引用)
-->
<TextBlock Margin="5" Text="我是 TextBlock">
<TextBlock.Resources>
<SolidColorBrush x:Key="MyTextBlockForeground" Color="Red" />
</TextBlock.Resources>
<TextBlock.Foreground>
<StaticResource ResourceKey="MyTextBlockForeground" />
</TextBlock.Foreground>
</TextBlock> </StackPanel>
</Grid>
</Page>

Resource/StaticResourceDemo.xaml.cs

/*
* 演示“StaticResource”相关知识点
*/ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; namespace Windows10.Resource
{
public sealed partial class StaticResourceDemo : Page
{
public StaticResourceDemo()
{
this.InitializeComponent();
} private void btnChangeStaticResource_Click(object sender, RoutedEventArgs e)
{
// 获取 Application 中的资源
// (double)Application.Current.Resources["MyDouble1"]; // 获取关联 xaml 内的资源(本例中的资源定义在 xaml 中的 Page 下,所以用 this.Resources[""] 来获取)
if (textBlock3.FontSize == (double)this.Resources["MyDouble1"])
{
// 引用指定的资源
textBlock3.FontSize = (double)this.Resources["MyDouble2"];
}
else
{
textBlock3.FontSize = (double)this.Resources["MyDouble1"];
}
}
}
}

2、演示“ThemeResource”相关知识点
Resource/ThemeResourceDemo.xaml

<Page
x:Class="Windows10.Resource.ThemeResourceDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Resource"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <!--
ThemeResource 与 StaticResource 的区别是:ThemeResource 在运行时会根据主题的变化而重新计算
--> <!--
默认的主题资源的相关定义在如下位置(以我的开发环境为例)
1、C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\10.0.10586.0\Generic\generic.xaml
2、C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\10.0.10586.0\Generic\themeresources.xaml 注:默认的主题资源不会复制到应用程序中,这些资源字典在内存中作为 Windows 运行时本身的一部分存在
--> <Page.Resources> <ResourceDictionary>
<!--
通过 ResourceDictionary 内的 ResourceDictionary.ThemeDictionaries 内的 ResourceDictionary 来定义不同主题的资源
在资源中定义的主题分为 3 种:"Light", "Dark" 和 "HighContrast",其中 High Contrast(高对比度模式) 不常用,就不详细介绍了
-->
<ResourceDictionary.ThemeDictionaries> <!--
Default 主题,对应 ElementTheme.Dark 或 ApplicationTheme.Dark
-->
<ResourceDictionary x:Key="Default">
<!--
这里摘自 themeresources.xaml 中的部分定义,如果要覆盖其中的定义就自己再定义同名资源即可
-->
<SolidColorBrush x:Key="ApplicationPageBackgroundThemeBrush" Color="#FF000000" />
<SolidColorBrush x:Key="SystemControlBackgroundAccentBrush" Color="{ThemeResource SystemAccentColor}" /> <!--
这是系统级资源,不在 themeresources.xaml 内,其含义是在“设置”->“个性化”->“颜色”中选择的主题色,当然也可以这样重新定义
-->
<Color x:Key="SystemAccentColor">#FFFF0000</Color>
</ResourceDictionary> <!--
HighContrast 主题,不常用,就不详细介绍了
-->
<ResourceDictionary x:Key="HighContrast">
<!--
这里摘自 themeresources.xaml 中的部分定义,其引用的一些颜色资源来自系统级,比如 SystemColorWindowColor 或 SystemColorButtonFaceColor 之类的,他们不在 themeresources.xaml 内
比如在“设置”->“轻松使用”->“高对比度”中目前可以设置 4 中不同的高对比度主题,每一种对应的颜色资源都不一样
-->
<SolidColorBrush x:Key="ApplicationPageBackgroundThemeBrush" Color="{ThemeResource SystemColorWindowColor}" />
<SolidColorBrush x:Key="SystemControlBackgroundAccentBrush" Color="{ThemeResource SystemColorButtonFaceColor}" />
</ResourceDictionary> <!--
Light 主题,对应 ElementTheme.Light 或 ApplicationTheme.Light
-->
<ResourceDictionary x:Key="Light">
<!--
这里摘自 themeresources.xaml 中的部分定义,如果要覆盖其中的定义就自己再定义同名资源即可
-->
<SolidColorBrush x:Key="ApplicationPageBackgroundThemeBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="SystemControlBackgroundAccentBrush" Color="{ThemeResource SystemAccentColor}" /> <!--
这是系统级资源,不在 themeresources.xaml 内,其含义是在“设置”->“个性化”->“颜色”中选择的主题色,当然也可以这样重新定义
-->
<Color x:Key="SystemAccentColor">#FF00FF00</Color>
</ResourceDictionary> </ResourceDictionary.ThemeDictionaries>
</ResourceDictionary> </Page.Resources> <Grid Background="Transparent"> <StackPanel Name="panel" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="10 0 10 10"> <TextBlock Margin="5" Name="lblMsg" Foreground="Blue" /> <TextBlock Margin="5" Text="Microsoft HoloLens全息眼镜由Microsoft 公司于北京时间2015年1月22日凌晨与Window10同时发布。" Foreground="Blue" /> <StackPanel Width="200" Height="100" Margin="5" HorizontalAlignment="Left" Background="{ThemeResource SystemControlBackgroundAccentBrush}" /> <!--动态变换主题,引用的主题资源会重新计算-->
<Button Name="btnChangeTheme" Click="btnChangeTheme_Click" Margin="5">变换主题</Button> </StackPanel> </Grid>
</Page>

Resource/ThemeResourceDemo.xaml.cs

/*
* 演示“ThemeResource”相关知识点
*
*
* 1、主题共有两种类别:Light 和 Dark,子会继承父的主题类别
* 2、Application 级别指定 Theme 的话,在 App.xaml 中做如下声明 <Application RequestedTheme="Dark"></Application>
* 3、FrameworkElement 级别指定 Theme 的话,则指定 FrameworkElement.RequestedTheme 即可
*
*
* Application.Current.RequestedTheme - 获取或设置 Application 级别的主题(ApplicationTheme 枚举:Light, Dark)
* FrameworkElement.RequestedTheme - 获取或设置 FrameworkElement 级别的主题(ElementTheme 枚举:Default, Light, Dark)
* 注:ElementTheme 比 ApplicationTheme 多了一个 Default,其含义是当 ElementTheme 为 Default 时,其实际主题为 application 级主题
*/ using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; namespace Windows10.Resource
{
public sealed partial class ThemeResourceDemo : Page
{
public ThemeResourceDemo()
{
this.InitializeComponent(); DisplayMessage();
} private void DisplayMessage()
{
// 当前 Application 级别的 Theme
lblMsg.Text = "application theme: " + Application.Current.RequestedTheme.ToString();
lblMsg.Text += Environment.NewLine; // 当前 panel 的 Theme
lblMsg.Text += "FrameworkElement theme: " + panel.RequestedTheme.ToString();
} // 动态变换主题,引用的主题资源会重新计算
private void btnChangeTheme_Click(object sender, RoutedEventArgs e)
{
if (panel.RequestedTheme == ElementTheme.Default) // 未指定 panel 的主题,则 panel 主题同 application 级主题
{
if (Application.Current.RequestedTheme == ApplicationTheme.Dark) // application 是 Dark 主题
{
panel.RequestedTheme = ElementTheme.Light;
}
else
{
panel.RequestedTheme = ElementTheme.Dark;
}
}
else if (panel.RequestedTheme == ElementTheme.Dark) // panel 是 Dark 主题
{
panel.RequestedTheme = ElementTheme.Light;
}
else // panel 是 Light 主题
{
panel.RequestedTheme = ElementTheme.Dark;
} DisplayMessage();
}
}
}

App.xaml

<Application
x:Class="Windows10.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10" RequestedTheme="Dark">
<!--
上面的 RequestedTheme 被我设置为 Dark 了,关于主题的相关知识点请参见:/Resource/ThemeResourceDemo.xaml
--> </Application>

OK
[源码下载]

背水一战 Windows 10 (10) - 资源: StaticResource, ThemeResource的更多相关文章

  1. 资源: StaticResource, ThemeResource

    StaticResource ThemeResource 示例1.演示“StaticResource”相关知识点Resource/StaticResourceDemo.xaml <Page x: ...

  2. 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件

    [源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...

  3. 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定

    [源码下载] 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定 作者:we ...

  4. 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例

    [源码下载] 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例 作者:webabcd 介绍背水一战 Windows 10 之 资源 资源限定符概述 资源限定符示例 ...

  5. 背水一战 Windows 10 (35) - 控件(弹出类): FlyoutBase, Flyout, MenuFlyout

    [源码下载] 背水一战 Windows 10 (35) - 控件(弹出类): FlyoutBase, Flyout, MenuFlyout 作者:webabcd 介绍背水一战 Windows 10 之 ...

  6. 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧

    [源码下载] 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧 作者:webabcd 介绍背水一战 Wind ...

  7. 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换

    [源码下载] 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换 作者:webabcd 介 ...

  8. 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI

    [源码下载] 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI 作者:webabcd 介绍背水一战 Wind ...

  9. 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate

    [源码下载] 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate 作者:webabcd 介绍背水一战 Windows 10 ...

随机推荐

  1. 远程调试 Azure Web App

    当我们将 Web App 部署在 Azure 上时,如果能够实现远程调试,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.易用著称,当然可以实现基于 Azure 应 ...

  2. Android学习笔记50:使用WebView控件浏览网页

    在Android中,可以使用Webview控件来浏览网页.通过使用该控件,我们可以自制一个简单的浏览器,运行效果如图1所示. 图1 运行效果 1.WebView 在使用WebView控件时,首先需要在 ...

  3. IOS 多线程01-线程基础知识

    大部分现代操作系统,包括IOS,都支持执行线程的概念.每个进程可以包含多个线程,他们可以同时运行.如果只有一个处理器核心,操作系统将在所有执行线程之间切换,非常类似于在所有执行线程之间切换.如果拥有多 ...

  4. Redis服务器的启动过程分析

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文将通过分析代码来介绍Redis的 ...

  5. png图片尺寸大小调整

    Android 开发中经常遇到各种hdpi,xhdpi,xxhdpi....很多尺寸大小的png图片要求. 网上也有不少工具,今天我又发现一款在线转换大小的网站,用了一下,一个png 114X114 ...

  6. atitit 短信接口规范与短信解决方案.docx

    atitit 短信接口规范与短信解决方案.docx 1.1. 国内比较著名的短信提供商1 1.2. 短信接口规范1 1.3. 短信sdk构成1 1.4. 短信的实现1 1.5. SmsServiceY ...

  7. Atitit usrQBF2312 命名空间pkg 以及 api命名 spec规范

    Atitit usrQBF2312 命名空间pkg 以及 api命名 spec规范 简化英文1 常用类库sdk的命名单词统计表1 简化时间规则1 Namsspace nam spec,参照java . ...

  8. salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)

    上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件 ...

  9. redis + 主从 + 持久化 + 分片 + 集群 + spring集成

    Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...

  10. 快速入门系列--深入理解C#

    C#语言在近些年得到了长足的方法,代码风格越来越简洁美观,例如常用的泛型及其约束.可空类型.隐式类型.匿名类型和委托等,通过下面的表格可以对这部分相对简单的特性的使用有一个初步的了解. 特性 示例 泛 ...