UWP入门(四)--设置控件样式
官方定义:可以使用 XAML 框架通过多种方式自定义应用的外观。 通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观。
可分享至不同elements的资源中 创建可重用的style,并且这一资源可以分享至整单页面、多页面、整个 app,甚至不同的app?
how to keep up with style in different app (pre-build theme) 预建主题
2. 直接看简单的Demo
<Page.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Brown"/>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="Hello World" Foreground="{StaticResource MyBrush}"/>
</Grid>
这里将 Foreground 设置了 Binding 语句,可以看到{StaticResource MyBrush}
,并且命名为MyBrush
当我们需要绑定一个 Resouce 的时候,需要做的表达式就是
{StaticResource resource名称}
//大括号意思是绑定,StaticResource 代表了我们需要绑定资源的名称
//上面代码的意思就是我们绑定了一个在 XAML 中定义的资源,并且这个资源只有在app最初的时候被计算
//Yes,还有其它类型,不用急着一次记完,以后还会说
<Page.Resources>
中可以绑定多个资源,eg:
<TextBlock Text="Hello World" Foreground="{StaticResource MyBrush}"/>
<x:String x:Key="greeting">Hello World</x:String>
2. style 样式简介
不仅是简单的 resource,我们可以通过style来重复利用一个或多个特定设置,不管是单个页面还是整个App
当重复利用这个 style 时,你可以设定一个特定的 control style 特性,然后将它与已知的 style 相连接
<Page.Resources>
<Style TargetType="Button">
<Setter Property="BorderThickness" Value="5" />
<Setter Property="Foreground" Value="Blue" />
<Setter Property="BorderBrush" >
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<StackPanel Orientation="Horizontal">
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
</StackPanel>
注意名称,不要太在意细节,我讲重点:
在 Style 定义中,你需要一个 TargetType 属性和由一个或多个 Setter 元素组成的集合。 TargetType 属性是一个指定要应用样式的 FrameworkElement 类型的字符串(系统已经有的style)。 TargetType 值必须指定由 Windows 运行时定义的派生的 FrameworkElement 类型或引用的程序集中提供的自定义类型。 如果你试图将某个样式应用到某控件,而此控件的类型与你试图应用的样式的 TargetType 属性不匹配,则会发生异常。自定义名字的在后面
每个 Setter 元素都需要一个 Property 和一个 Value。 这些属性设置用于指示该设置将应用于哪个控件属性,以及为该属性设置的值。 你可以使用特性或属性元素语法设置 Setter.Value。 下面的 XAML 显示了应用于前面显示的按钮的样式。 在此 XAML 中,前两个 Setter 元素使用特性语法,但是最后一个 Setter(用于设置 BorderBrush 属性)使用属性元素语法。 该示例不使用 x:Key 特性这一特性,因此该样式已隐式应用到按钮。 隐式或显式应用样式之后讲
自定义名称只需要加一句:
<Style TargetType="Button" x:Key="MyButtonStylr">
3. 应用隐式或显式样式
如果你将样式定义为资源,有两种方法可将其应用到控件:
- 隐式方法,通过仅指定 Style 的 TargetType。
- 显式方法,通过指定
Style
的TargetType
和x:Key
特性这一特性,然后通过使用显式键的{StaticResource}
标记扩展引用设置目标控件的Style
属性
如果样式包含 x:Key
特性,则只能通过将控件的 Style
属性设置为键控样式,从而将其应用到控件。 相反,没有 x:Key 特性的样式会自动应用到其目标类型的每个控件,这些控件没有显示样式设置。
下面两个按钮演示了隐式和显示样式
下面两个按钮演示了隐式和显示样式,在本示例中,第一个样式具有 x:Key 特性,其目标类型为 Button。 第一个按钮的 Style 属性设置为此关键字,所以显示应用该样式。 第二个样式会隐式应用到第二个按钮,因为该按钮的目标类型为 Button,并且该样式没有 x:Key 特性
<Page.Resources>
<Style x:Key="PurpleStyle" TargetType="Button">
<Setter Property="FontFamily" Value="Lucida Sans Unicode"/>
<Setter Property="FontStyle" Value="Italic"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Foreground" Value="MediumOrchid"/>
</Style>
<Style TargetType="Button">
<Setter Property="FontFamily" Value="Lucida Sans Unicode"/>
<Setter Property="FontStyle" Value="Italic"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="25"/>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" Value="Orange"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Foreground" Value="Orange"/>
</Style>
</Page.Resources>
<Grid x:Name="LayoutRoot">
<Button Content="Button" Style="{StaticResource PurpleStyle}"/>
<Button Content="Button" />
</Grid>
4. 关于样式书写位置
上面写的都是专属于 MainPage 的,如果想在 app 的所有页面中用呢?
将 PageResouce 这一部分删掉,然后将它们创建App.XML 中的 Applcation.Resource 元素上
<Application.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Brown"/>
<x:String x:Key="greeting">Hello World</x:String>
<Style TargetType="Button" x:Key="MyButtonStylr">
<Setter Property="Background" Value="Blue"/>
<Setter Property="FontSize" Value="36"/>
</Style>
<Style TargetType="Button">
<Setter Property="BorderThickness" Value="5" />
<Setter Property="Foreground" Value="Blue" />
<Setter Property="BorderBrush" >
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
5. merg resource dictory 和自定义 resource dictory 文件
不光是在 page 和 application 中设定简单的 resource.dictory,我们还可以创建名为 merg resource dictory ,能让你在多个文档中找到 resource dictory ,然后将他们结合在一起,可以通过这个保持程序的复杂性,并且可以在不同的项目中重用这些 dictionary 文档
步骤:
右上角 Project 右键 –> Add new Item –> Resource Dictory
Dictionary1.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XAMLResources">
<SolidColorBrush x:Key="brush" Color="Red"/>
</ResourceDictionary>
Dictionary2.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XAMLResources">
<x:String x:Key="greeting">Hello world</x:String>
</ResourceDictionary>
MainPage.xaml
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml" />
<ResourceDictionary Source="Dictionary2.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Page.Resources>
<StackPanel>
<TextBlock Text="{StaticResource greeting}"
Foreground="{StaticResource brush}" />
<Button Content="My Button Style Example"
Height="100"
Style="{StaticResource MyButtonStyle}" />
</StackPanel>
6.基于样式使用
为了使样式便于维护以及优化样式的重复使用,你可以创建从其他样式继承的样式。 使用 BasedOn
属性可创建继承的样式。
从其他样式继承的样式必须应用到同一类型的控件,或者从基本样式的目标类型派生出来的控件。 例如,如果基本样式的目标类型为 ContentControl,则基于此样式的样式可应用到 ContentControl 或从 ContentControl 派生的类型(如 Button 和 ScrollViewer)。 如果基于样式(子类)的值没有设置,则从基本样式继承(父类)。 要从基本样式更改值,基于样式会覆盖该值。 下一个示例演示了具有从同一基本样式继承的样式的 Button 和 CheckBox
基本样式应用到 ContentControl,并设置 Height 和 Width 属性。 基于此样式的样式应用到 CheckBox 和 Button,这些类型从 ContentControl 派生而来。 基于样式为 BorderBrush 和 Foreground 属性设置不同的颜色。 (通常不在 CheckBox 的周围加边框。 我们在此处执行此操作,来显示样式的效果。)
<Page.Resources>
<Style x:Key="BasicStyle" TargetType="ContentControl">
<Setter Property="Width" Value="130" />
<Setter Property="Height" Value="30" />
</Style>
<Style x:Key="ButtonStyle" TargetType="Button"
BasedOn="{StaticResource BasicStyle}">
<Setter Property="BorderBrush" Value="Orange" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="Foreground" Value="Red" />
</Style>
<Style x:Key="CheckBoxStyle" TargetType="CheckBox"
BasedOn="{StaticResource BasicStyle}">
<Setter Property="BorderBrush" Value="Blue" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="Foreground" Value="Green" />
</Style>
</Page.Resources>
<StackPanel>
<Button Content="Button" Style="{StaticResource ButtonStyle}" Margin="0,10"/>
<CheckBox Content="CheckBox" Style="{StaticResource CheckBoxStyle}"/>
</StackPanel>
UWP入门(四)--设置控件样式的更多相关文章
- QSS基础-设置控件样式
1.QSS基础-设置同类控件样式'''QSS基础:Qt Style SheetQt样式表用于设置控件的样式和风格(比如控件的背景色,字体颜色,字体大小等)和CSS的功能比较相似,功能相似''' fro ...
- UWP 设置控件样式四种方法
1.隐式方法,通过仅指定 Style 的 TargetType.(设置全部的Button样式) <Page.Resources > <Style TargetType="B ...
- leaflet-webpack 入门开发系列四图层控件样式优化篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- C#:设置控件样式(待补充)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- qt 设置程序控件样式
1. 以资源文件的形式设置控件样式 QFiledata(QString(":/style.qss")); QStringqssFile; if(data.open(QFile::R ...
- WPF:DataTemplateSelector设置控件不同的样式
原文 WPF:DataTemplateSelector设置控件不同的样式 最近想实现这么个东西,一个ListBox, 里面的ListBoxItem可能是文本框.下拉框.日期选择控件等等. 很自然的想到 ...
- IrisSkin 单独控件样式设置 不使用皮肤样式
可以设置控件的Tag为this.skinEngine1.DisableTag [DefaultValue()] [Description("If you do not want skin t ...
- WPF设置控件获取键盘焦点时的样式FocusVisualStyle
控件获取焦点除了用鼠标外,可以通过键盘来获取,比如Tab键或者方向键等,需要设置控件获取键盘焦点时的样式,可以通过设置FrameworkElemnt.FocusVisualStyle属性, 因为几乎所 ...
- WPF设置全局控件样式
原文:WPF设置全局控件样式 方法: 在资源文件APP.XAML中添加如下资源 <Application x:Class="_360UI.App" xmlns="h ...
随机推荐
- 代码包结构分析工具JDepend的使用方法
JDepend可以对Java软件包结构质量进行分析,已经有很多文章介绍其基本作用和能够计算的指标了,这里我就不详细总结,感兴趣的朋友可以参看如:http://blog.csdn.net/hantian ...
- NOIP模拟 最佳序列 - 二分 + 单调队列
题意: 各一个n(\(\le 20000\))的序列,定义纯洁序列为长度len满足\(L \le len \le R\)的序列,纯洁值为某一纯洁序列的平局值,输出所有纯洁序列中最大平均值. 分析: 二 ...
- [Erlang 0057] Erlang 排错利器: Erlang Crash Dump Viewer
http://www.cnblogs.com/me-sa/archive/2012/04/28/2475556.html Erlang Crash Dump Viewer真的是排错的天兵神器,还记得我 ...
- AJAX跨域与JSONP的一点实践经验
前几个周,项目中遇到了AJAX跨域的问题,然后找资料解决了. 首先要说明一点,关于AJAX的跨域原理和实践,我的经验还是比较少的,我只是大致看了下网上的资料,结合自己的理解,找到了解决办法,暂时不去仔 ...
- 解决gdb 调试 core 文件函数名显示为问号的问题
关于gdb调试core文件总是一堆问号的问题 问题描写叙述:已经在编译选项中增加了-g,可是查看core文件时.还是一堆问号,使用的命令为:gdb -c core 解决方式:因为gdb -c core ...
- 【codeforces 534B】Covered Path
[题目链接]:http://codeforces.com/contest/534/problem/B [题意] 你在t秒内可以将车的速度任意增加减少绝对值不超过d; 然后要求在一开始车速为v1,t秒之 ...
- 【BZOJ 3676】[Apio2014]回文串
[链接] 链接 [题意] 给你一个字符串s. 定义一个子串的出现值为它出现的次数*字符串的长度. 让你求里面的回文子串的最大出现值 |s|<=3e5 [题解] 马拉车算法里面. 只有在回文往外扩 ...
- RGB值得计算公式
三原色分别为:红(Red).绿(Green).蓝(Blue). 颜色值=(Red)+(Green*256)+(Blue*256*256) //由三原色值合成颜色整数值 function ColorFr ...
- LaTeX —— 特殊符号与数学字体
1. 特殊符号 ℓ(\ell):用于和大小的 I 和 数字 1 相区分 R(\Re) ∇(\nabla):微分算子 2. 数学字体 mathbb:blackboard bold,黑板粗体 mathca ...
- android隐藏显示小键盘
记录一下开发中虚拟键盘的使用,fragment和activity中不同的使用 fragment下点击其它位置隐藏小键盘,复制到initView()方法中 view.setOnTouchListener ...