WPF学习一:XAML的资源(Resources)结构
一个初学者,把知识做个积累,如果有不对的地方,还请高手指出,谢谢!
先看一段代码:(下面是以Window WPF进行讲解,如果是Web 的话就把<Window改为<Page 而如果是 UserControl 的话,就改成<UserControl ... )
<Window x:Class="brush.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300">
<Window.Resources >
<Style x:Key="ButtonStype" TargetType="Button" >
<Setter Property="BorderBrush">
<Setter.Value>
<SolidColorBrush Color="Red" Opacity="0.5" />
</Setter.Value>
</Setter>
<Setter Property="Width" Value="100" />
<Setter Property="Height" Value="100" />
</Style>
</Window.Resources>
<Grid >
<Button BorderThickness="10" Margin="125,85,53,77" Style="{StaticResource ButtonStype }">Clik Me</Button>
</Grid> </Window>
上面代码中用Window.Resources 定义一个Window级的Resources ,这只是一种以Window级的资源的定义.
其实Resources的定义可以在每一个容器控件中,(或者是在每一个控件,在Template 中可以用到),像C#中变量的定义一样,Resource的定义的地方不同
也就决定它的作用范围,如:
Window.Resources它的作用范围就是在Window容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源
Grid.Resources它的作用范围就是在Grid容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源
以此类推....
请注意:Window不是最上层的"容器",最上层的应该是Appication ,所以Application.Resources 的作用范围更大(有人把Application.Resource叫作全局资源,所有在这个Application下的容器控件等都可以使用,常用来做一个应该程序的Skin ,其ResourceDictionary定义的资源也类似 )
(<<我眼里的XAML结构框架>>概括为:"一个Application下有多个Window ,一个Window下有一个Grid,一个Grid下有很多布局容器,这些容器里面有好子容器或控件 ,控件里面有Template,template里面又可以里Grid…… ")
在我们敬爱的包包的Blog写到:"绑定后,从底层向上开始找数据源,直到发现位置为止,最上层是<Window>” 不知道是是理解的不对,还是其它的(请包老师指点一下)
我认为最上层应该是Application
<Application x:Class="brush.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="MyApplication_Startup" >
<Application.Resources>
<LinearGradientBrush x:Key="GrayBlueGradientBrush" StartPoint="0,0" EndPoint="1,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="DarkGray" Offset="0" />
<GradientStop Color="#CCCCFF" Offset="0.5" />
<GradientStop Color="DarkGray" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
......
当一个控件绑定了Resources 时,它是从本身所在的容器所定义的资源往上找,直到找到,找到后就不再往上找,最上层就是Application.Resources
对于Application.Resources动态改变资源还有以下几点:
请注意绑定的时候要用DynamicResource而进绑定而不能是上面的StaticResource (这两个的区别是:StaticResource是在编译时绑定,而DynamicResource
在需要是去绑定,具体请看后面写的"XAML的标志扩展")
1,不只是在定义了<Application的xaml里可以定义Resources 还定用下面的方法来加ResourceDictionary里的资源
ResourceDictionary: Resources/myStyle.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
> <!-- 以下和 object.Resources的写法一样-->
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="12" />
</Style>
.....
在需要换肤的代码中写:
Uri skinDictUri = new Uri("Resources/myStyle.xaml", UriKind.Relative);
// Tell the Application to load the skin resources.
DemoApp app = Application.Current as DemoApp;
app.ApplySkin(skinDictUri);
或者是这样写:
private void ChangeSkin(object sender, ExecutedRoutedEventArgs e)
{
ResourceDictionary rd = new ResourceDictionary();
rd.MergedDictionaries.Add(Application.LoadComponent
(new Uri("Resources/myStyle.xaml", UriKind.Relative)) as ResourceDictionary);
Application.Current.Resources = rd;
// save the skin setting
appSettings.Skin = e.Parameter as string;
appSettings.Save();
}
另外一种Resources.Add(此方法不仅可以应用到Application.Resources中,还可以应该到Window Controls 的Resources中去) window.Resources.Add("borderBrush", new SolidColorBrush(Color.FromRgb(255, 0, 0)));
转:http://www.cnblogs.com/CsharpBlog/archive/2009/10/14/1583481.html
WPF学习一:XAML的资源(Resources)结构的更多相关文章
- WPF学习笔记-使用自定义资源字典(style)文件
1.添加资源字典文件style.xmal 2.在资源字典中添加自定义style等 <ResourceDictionary xmlns="http://schemas.microsoft ...
- WPF学习之资源-Resources
WPF学习之资源-Resources WPF通过资源来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等,而在其支持上也更能体现出这些资源定义的优越性.比如通过Resour ...
- (转)WPF学习资源整理
由于笔者正在学习WPF,所以整理出网络中部分WPF的学习资源,希望对同样在学习WPF的朋友们有所帮助. 首推刘铁猛的<深入浅出WPF>系列博文 1.深入浅出WPF(1)——什么是WPFht ...
- WPF学习资源整理
WPF(WindowsPresentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型 ...
- XAML实例教程系列 - 资源(Resources)
Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - 资源(Resources) 2012-08-10 12:47 by jv9, 1386 阅读, 1 评论, 收藏, 编辑 在Wi ...
- 【WPF学习】第三十四章 资源基础
WPF允许在代码中以及在标记中的各个位置定义资源(和特定的控件.窗口一起定义,或在整个应用程序中定义). 资源具有许多重要的优点,如下所述: 高效.可以通过资源定义对象,并在标记中的多个地方使用.这会 ...
- 【WPF学习】第三十五章 资源字典
如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <Resour ...
- 【WPF学习】第六十一章 组织模板资源
为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院今天发布公告,决定2020年4月4日举行全国性哀悼活动. 当使用控件模板时,需要决定如何更广泛地共享模板,以及是否希望自动地 ...
- 学习WPF——了解WPF中的XAML
XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Butt ...
随机推荐
- 8、泛型程序设计与c++标准模板库3.迭代器
理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...
- MapperScan的工作,Spring-Mybatis怎么自动getMapper
@MapperScan @Import(MapperScannerRegistrar.class) @Repeatable(MapperScans.class) public @interface M ...
- SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协议
为什么你要使用自定义协议? 通信协议用于将接收到的二进制数据转化成您的应用程序可以理解的请求. SuperSocket提供了一个内置的通信协议“命令行协议”定义每个请求都必须以回车换行"\r ...
- SQL Server修改主、外键和约束
0.创建表 create table Users ( Id int, Name ), Phone ), Email ), Role_Id uniqueidentifier ) go create ta ...
- [CentOS7] gzip, bzip2, xz 压缩与解压缩
声明:本文主要总结自:鸟哥的Linux私房菜-第八章.檔案與檔案系統的壓縮,打包與備份,如有侵权,请通知博主 gzip命令: 选项参数: -c :将压缩后的数据显示到屏幕上,可以用于重定向: -d : ...
- PAT1098【插入排序+堆排序】
简单插入排序: 简单插入排序的核心思想: 把一条这么个难看的序列默认分为两个排好序的和未排好序的两个部分: 所以一开始排好序的只有一个a[0](好看的只有一个),难看的有N(数组长度)-1个a[1,n ...
- 字符串游戏(strgame)——博弈
题目 [题目描述] pure 和 dirty 决定玩 $T$ 局游戏.对于每一局游戏,有 $n$ 个字符串,并且每一局游戏由 $K$ 轮组成.具体规则如下:在每一轮游戏中,最开始有一个空串,两者轮流向 ...
- mysql安装等操作
CentOS 6.5系统中安装配置MySQL数据库 卸载掉原有mysql rpm -qa | grep mysql // 这个命令就会查看该操作系统上是否已经安装了mysql数据库 rpm -e my ...
- Linux调优(文件系统)
查看单个文件是否发生碎片化(被存在磁盘非连续磁盘块上) # filefrag -v /var/log/messages 查看文件系统是否存在大量碎片(会显示空闲离散的块) # dumpe2fs /de ...
- Meissel Lehmer Algorithm 求前n个数中素数个数 【模板】
Count primes Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...