WPF 杂谈——资源文件
编写一个应用难免要用到WPF本身的控件。不管是WinForm还是网页都会有自己的控件。只是在写法和用法上有所不同而以。而控件命名却离不开那几个单词。所以不用担心判断不出来哪个是按扭,哪个是文本框。举个例子吧。
HTML
<input type="button" value="扭按" />
WinForm
private System.Windows.Forms.Button button1;
WPF
<Button Content="按扭"/>
看到了吧。本质上来讲没有什么区别。只要学习他的属性用法就可以了。
在设计业务界面的时候,我们一定离不开对界面进行相应的布局。网页上常常会用到DIV+CSS来进行布局。只是笔者想要讲的不是要用到什么技术。而是用到的知识。如:HTML里面用于布局元素有DIV、SPAN、Table等。又好比如:WinForm里面常常会用Panel。那么WPF里面是不是也有类似这样子的知识点。这是当然了。值得注意的是PC端(C/S)和网页(B/S)在布局上有所不同。PC端这边多出了一个布局方式的知识点。一般有分为绝对布局(AbsoluteLayout),边框布局(BorderLayout),流布局(FlowLayout),表格布局(TableLayout),锚点布局(AnchorLayout)等。但是不是什么布局都存在。这个要看设计这门技术的人有没有把所有的布局都包进来。
WPF用于布局的元素有:Grid,StackPanel,WrapPanel。这些全是布局方式的知识。如下
Grid:表格布局或是绝对布局。
StackPanel:线性布局(要么垂直要么水平)。
WrapPanel:流布局。
可以说上面这三个元素足够让你们布局出令流目的界面出来。但是这只是用于界面上的划分。而想要做的美丽和漂亮就要用到样式(Style)。
笔者学习WPF的样式,最开始是以CSS样式来学习。如:CSS有三种方式来实现——外部样式,内部样式,内嵌样式。WPF的样式(Style)实现有几种方式呢?笔者从开发过程得出来——二种。没有了内嵌样式。但是却又多出了一种概念。这个概念跟控件有关系。所以笔者就在网页上面下载了一个图片。如下
我们可以从图片上看到所有常用到的控件都会继承于FrameworkElement类。在FrameworkElement类里面有一个属性叫Resources。这个属性里面可以创建和存放各种各样的样式。这就意味着每一个控件都有自己的样式存放的地方。也就是说样式的作用可以控制到某个控件的范围。虽然网页也可以随时随地的创建CSS样式。只要在声明的Style里面就行了。但是他还是作用于整个网页。所以WPF在控件或是Window窗体里面声明的样式笔者都喜欢叫他们为内部样式。
网页上的外部样式是引用一个外部文件。而这个外部文件里面存放大量的CSS样式。同样子WPF也是这样子的。但是有一个区别的——范围。网页上的外部文件最终作用只能是某个网页,但是WPF的作用可以是整个应用。不管是多少个Window,多少个UserControl。就是上一章中讲到的在Application里面设置引用的外部文件。也是笔者认为的外部样式。如下
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
即然每一个控件都会有自己的样式资源,那问题来了——如果俩个样式对同一个对象进行修饰,那么他要什么样子选择呢?举一个小小的例子吧。
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"></Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Blue"></Setter>
</Style>
</Grid.Resources>
<TextBlock Text="1223"></TextBlock>
</Grid>
</Window>
运行结果:
笔者在Window窗体里面写了一个对TextBlock控件进行修饰的样式,同时前景色设为红色。在Grid也写了一个对TextBlock控件进行修饰的样式,只是这个颜色为蓝色。结果我们可以看到他会选择最近的样式。
上面列子里面笔者是对所有的TextBlock控件进行修饰。跟CSS样式里面的元素选择器有一点类似。往往一般用于自定义控件。还有一种写法,跟CSS样式里面的类选择器有一点类似。如下
<Style x:Key="AlertButton" TargetType="ButtonBase" BasedOn="{StaticResource SystemButtonBase}">
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Margin" Value="8"/>
<Setter Property="Padding" Value="4"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value=".7" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Opacity" Value=".4" />
</Trigger>
</Style.Triggers>
</Style>
上面的代码来自于开源项目FirstFloor.ModernUI里面的。“x:Key”就是相当于CSS样式里面的"."。除了这些之外我们还是可以看到baseOn,它用于继承的。相信大家都可以看得懂是什么意思。Setter用于设置当前的属性值。Style.Triggers用于一些触发动作设置。比如按扭按下时要发生一些什么样子的变化。Property="IsPressed" Value="True"就是相当于IF。当前按扭按下去时候,IsPressed的值会变成True。发现服合当前的一个触发条件。于是就开始执行相应的设置工作。如:上面透明度(Opacity)会成.4。
当前除了上面讲到的样式之外,资源还可以存放别的东西。如:颜色。算了。只有文字的说明不能够明显和直接。在笔者在举个列子吧。
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<sys:String x:Key="TestString">I am Aomi</sys:String>
</Window.Resources>
<Grid>
<TextBlock Text="{StaticResource TestString}"></TextBlock>
</Grid>
</Window>
运行结果:
我们可以看到。资源文件不只是样式,还可以存放一些系统的值。但是一定要注意引用。如上面的xmlns:sys="clr-namespace:System;assembly=mscorlib"。
在引用样式方面,WPF也分为静态和动态的差别。如上面是静态引用。动态则要用到关键字DynamicResource。那么动态资源和静态资源的概念就出来。记得以前有人问过笔者他们之间到底有什么差别。笔者连什么是动态资源,什么是静态资源都搞不清楚。
静态资源(StaticResource):会在加载xaml文件的时候进行初始化,而且只有一次。同时运行的时候是不能对资源进行相关的操作。这就意味着后面如果对资源进行修改,是不会同步相应的引用。
动态资源(DynamicResource):会在运行的时候进行初始化,同时运行的时候也可以操作。显然后面对资源进行修改会同步到相应的引用。
知道这些之后,让笔者做了例子吧。就按上面的列子稍微的修改一下吧。
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<sys:String x:Key="TestString">I am Aomi</sys:String>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<TextBlock x:Name="TbText" Grid.Row="0" Text="{DynamicResource TestString}"></TextBlock>
<Button Grid.Row="1" Content="变化" Click="Button_Click"></Button>
</Grid>
</Window>
后台按扭的代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Resources["TestString"] ="aaa";
}
动态资源的执行结果:
把上面的引用改成如下静态引用。
<TextBlock x:Name="TbText" Grid.Row="0" Text="{StaticResource TestString}"></TextBlock>
静态资源的执行结果:
至于到底是用动态资源好,还是用静态资源好呢?笔者是这样子理解的:静态资源他只会在编译的时候加载一次。后面哪怕你修改他资源也不会发生变化。而动态资源会在编译的时候也初始化,只是这个时候的值并没有被初始化。只有在运行过程中需要的时候才会去加载值。所以呢?如果在项目过程中不需要后面修改变化的话,可以试着用静态资源。要明白动态资源可不是加载一次哦。性能还是要想一想的。
WPF 杂谈——资源文件的更多相关文章
- WPF样式资源文件简单运用
WPF通过资源来保存一些可以被重复利用的样式,下面的示例展示了简单的资源样式文件的使用: 一.xaml中定义资源及简单的引用 <Window.Resources > <!--wpf窗 ...
- WPF 导出资源文件
在wpf开发中我们可以把各种文件.图片打包到项目中也就是应用程序资源文件,然后在项目中可以通过特定的uri格式去调用.那有些时候为了方便我们可能想要在程序中将资源文件导出来使用,那么怎么做呢? 第 1 ...
- C# wpf 使用资源文件 resx
随意新建一个wpf应用 在cs代码编辑,增加 using System.Resources; 放在最上 在方案新建文件夹 名 文件 在 文件 新建资源文件 资源.resx 资源.resx 添加字符串 ...
- WPF绑定资源文件错误(error in binding resource string with a view in wpf)
报错:无法将"***Properties.Resources.***"StaticExtension 值解析为枚举.静态字段或静态属性 解决办法:尝试右键单击在Visual Stu ...
- 对比MFC资源文件谈谈WPF布局方式
对比MFC资源文件谈谈WPF布局方式 MFC方式 对于传统的MFC基于UI的应用程序设计通常分两步走,首先是设计UI,使用的是RC文件,然后是代码文件,对RC文件进行操作,如下面Figure 1 的基 ...
- wpf 前台获取资源文件路径问题
1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png&quo ...
- WPF 中的 Pack URI地(资源文件加载)
参考资源网http://msdn.microsoft.com/zh-cn/library/aa970069.aspx#Absolute_vs_Relative_Pack_URIs 在 Windows ...
- wpf中内置资源文件
wpf中包含三种文件类型 资源文件:编译到可执行或库 WPF 程序集中的数据文件. 内容文件:与可执行 WPF 程序集具有显式关联的独立数据文件. 源站点文件:与可执行 WPF 程序集没有关联的独立数 ...
- WPF基础篇之资源文件路径
WPF资源文件的路径 关于WPF资源文件的路径 这几天在WPF中调用资源文件的Uri时,因为是在代码里调用Uri写的Uri总是不对,要么运行直接报异常,要么说找不到资源文件.下面是我解决的整个经过和碰 ...
随机推荐
- 关于xml中有特珠字符而导致XmlDocument无法Load的处理
这是个小事故导致的... 我们线上有个节目里名称里(`F`H9)MSTJXCX0B3J69,虽然我们看到是(`F`H9)MSTJXCX0B3J69,但百思不得其解,发现每次在XmlDocument.L ...
- 搭建ftp服务器实现文件共享
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transfer Protocol ...
- 深入浅出数据结构C语言版(4)——表与链表
在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内 ...
- 类string解析
原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5645248.html 在涉及字符串的时候,我们可以定义字符数组或指针,其实还有一个类,专门是为字符 ...
- requireJS 从概念到实战
requireJS 可以很轻易的将一个项目中的JavaScript代码分割成若干个模块(module).并且requireJS推荐一个模块就是一个文件,所以,你将获得一些零碎的具有互相依赖关系的JS文 ...
- centos登录时一闪而过,显示module is unknown
原因是修改了在/etc/pam.d/login中加入了: session required /lib/security/pam_limits.so session required pam_limit ...
- placeholder的字体样式改变,滚动条的颜色改变,ios日期兼容
placeholder:::-webkit-input-placeholder { color: rgba(153, 153, 153, 0.541);font-size:12px;}:-moz-pl ...
- OC--Runtime知识点整理
1.Runtime简介 因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时.也就是说只有编译器是不够的,还需要一个运行时系统 (runtime system) 来执行编译 ...
- Python之路-基本数据类型
一.数据类型 1.数字 包含整型和浮点型,还有复数2.字符 长度,索引,切片也适用于列表的操作 移除空白 strip() 默认字符串前后的空格,制表符,换行符 strip(";") ...
- GNU/Linux与开源文化的那些人和事
一.计算机的发明 世上本无路,走的人多了,就有了路.世上本无计算机,琢磨的人多了--没有计算机,一切无从谈起. 三个人对计算机的发明功不可没,居功至伟.阿兰·图灵(Alan Mathison Tur ...