求wpf做一个温度计,像《深入浅出设计模式wpf》中说的那样

通过Attribute=Value语法赋值时,由于XAML的语法限制,Value的值只能是一个字符串。这就引出两个问题:
如果一个类能使用XAML语言进行声明,并且允许它的Propetry与XAML的Attribute互相映射,那就需要为这些Propetry准备适当的转换机制。
由于Value是个字符串,所以起格式复杂度有限,尽管转换格式里包含一定的按格式解析字符串的功能以便转换成复杂的目标对象,但这会让最终的XAML使用者头疼不已。
第一个问题的解决方案是使用TypeConverter类的派生类,在派生类里重写TypeConverter的一些方法。第二个问题的解决方法就是使用属性元素。
x名称空间的成员
x名称空间里的成员是专门给XAML的编译器看的,用来引导XAML编译器把XAML代码编译成CLR代码
Attribute是语言层面的东西,是给编译器看的,Propetry是面向对象层面的东西,是给编程逻辑看的。
x:Class的值所指示的类型在声明中必须使用partial关键字。
一个XAML便签对应着一个对象,这个对象一般是一个空间类的实例,类是引用类型,一般是“引用者-&实例”的成对出现,而且我们只能通过引用来访问实例,当一个实例不再被任何引用者所引用时,他就会被当成内存垃圾而销毁。
x:Name的作用有两个
(1)告诉XAML编译器,当一个标签带有x:Name时除了为这个标签生成对应的实例还要为这个实例声明一个引用变量,变量名就是x:Name的值。
(2)将XAML标签所对应的对象的Name属性(如果有)也设置为x:Name的值,并把这个值注册到UI树上,以方便查找。
如果一个标签没有Name属性,那么x:Name的作用就是仅仅为实例创建引用变量了。
&Button x:Name = "btn_Test" Content = "OK"/&
Button btn_Test = new Button();
btn_Test.Name = "btn_Test";
最自然的检索方式莫过于使用“Key-Value”对的形式了。在XAML文件中,我们可以把需要使用多次使用的内容提取出来放在资源字典里,需要使用这个资源我们就用它的Key检索出来,x:Key的作用就是为资源贴上用于检索的索引。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4065次
排名:千里之外
原创:39篇
(2)(4)(4)(6)(7)(14)(3)(3)WPF 深入浅出WPF 完整版,刘铁锰的。学习wpf很经典的一本书,自己正在学,很有用。 CSharp C#编程 238万源代码下载-
&文件名称: WPF
& & & & &&]
&&所属分类:
&&开发工具: Others
&&文件大小: 44349 KB
&&上传时间:
&&下载次数: 25
&&提 供 者:
&详细说明:深入浅出WPF 完整版,刘铁锰的。学习wpf很经典的一本书,自己正在学,很有用。-Layman WPF full version ferromanganese. Learning wpf classic a book that he is learning is useful.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&近期下载过的用户:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - c#开发中可能用到利用ESC指令打印条码或者放大字体等功能,里面详细介绍了,各种指令集的资料!
&[] - C#获取MP3歌词文件,由于时间关系,我只测试了程序可以编译运行,原理我还没有搞明白,先发上来让C#初学者参考吧,源码开源。
&[] - 《24小时自学WPF》WPF的经典之作,源代码我也传上来了
&[] - wpf经典源码,120例,详细的wpf源码,以及教程,超详细的!!
&[] - 微软的WPF入门类书籍,可以参阅一下,是一个WPF的入门
&[] - 深入浅出WPF,刘铁锰著,中国水利水电出版社。WPF是微软新一代开发技术,涵盖了桌面应用程序开发,网络应用程序开发和移动应用程序开发,是微软开发技术未来十年的主要方向。
&[] - WPF,WCF实现即时通信,登录注册、好友管理、聊天管理~
&[] - wpf 表格控件实例 wpf 表格控件实例wpf 表格控件实例  前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源。我们平时的&资源&一词是指&资财之源&,是创造人类社会财富的源泉。在计算机程序中,只要是对程序有用的对象都可以统称资源。不过本文只记录WPF对象级资源和二进制资源。
一、WPF对象级资源的定义与查找
  在WPF中,每一个界面元素都是一个对象,并且都有一个名为Resources的属性,这个属性继承于FrameworkElement类,其类型为ResourceDictionary。由于元素的属性名是复数形式,所以每一个对象可以拥有多个资源,由于资源的多样化,获取到的资源的类型为object类型,所以在获取到资源时,必要时要进行转化成符合自己要求的类型;由其类型可以知对象资源是以键值对的形式来存储的,当需要某个资源时,可以通过key索引来获取。下面看一个小实例:
&Window x:Class="Chapter_08.MainWindow"
xmlns="/winfx/2006/xaml/presentation"
xmlns:x="/winfx/2006/xaml"
xmlns:sys="clr-namespace:Sassembly=mscorlib"
Title="MainWindow" Height="350" Width="525" &
&Window.Resources&
&ResourceDictionary&
&sys:String x:Key="str"&
&/sys:String&
&/ResourceDictionary&
&/Window.Resources&
&Grid x:Name="grid"&
&TextBlock x:Name="textblock" Text="{StaticResource ResourceKey=str}"/&
在上面代码中资源为属性元素,所以&ResourceDictionary&是可以省略掉的,下面是在后台的等效代码:
this.Resources["str1"] = "我是资源";
this.textblock.Text = this.FindResource("str1") as string;
  由于比较简单,所以不贴效果图了。下面记录一下,检索资源的顺序,比如上面的例子,Textblock会先看一下自身有没有资源的Key为str的,如果没有发现的话,会继续沿着逻辑树往上找(也就是Window上找)。直到发现为止,如果在XAML中没有找到的话,程序还会在Application.Resources中找找看,如果再没有的话,那么就说我找不到(抛出异常)。提到&往外找&,如果有web经验的话,就想起js和css都可以在外面找,来控制页面的样式,WPF中完全也可以实现这样的功能。由于涉及到style,在此仅提一下使用方法:  &&
&Window.Resources& &ResourceDictionary Source="***.xaml"&
&/Window.Resources&
这个很像html的外联式写法。
二、动态资源与静态资源
  我们实际生活中包含可再生资源和非可再生资源。在计算机里面的资源也是有分类的。主要分为静态资源(StaticResource)和动态资源(DynamicResource)。静态资源是在程序运行时,直接把资源读到内存里面,以后就再也不会发生改变;动态资源是可以改变的,具体可以根据情况使用。下面通过简单的实例来说明其区别:
XAML代码:
&Window x:Class="Chapter_08.ResourceType"
xmlns="/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:Sassembly=mscorlib"
xmlns:x="/winfx/2006/xaml"
Title="ResourceType" Height="150" Width="150" Background="Brown"&
&Window.Resources&
&sys:String x:Key="DynamicRes"&动态资源&/sys:String&
&sys:String x:Key="StaticRes"&静态资源&/sys:String&
&/Window.Resources&
&StackPanel&
&TextBox x:Name="txt1" Text="{DynamicResource ResourceKey=DynamicRes}" Margin="10"/&
&TextBox x:Name="txt2" Text="{StaticResource ResourceKey=StaticRes}" Margin="10"/&
&Button x:Name="btn" Content="资源类型区分" Click="btn_Click_1" Height="25" Margin="5"/&
&/StackPanel&
点击事件代码:
private void btn_Click_1(object sender, RoutedEventArgs e)
this.Resources["StaticRes"] = "静态资源发生改变";
this.Resources["DynamicRes"] = "动态资源发生改变";
效果如图1:
三、二进制资源
  和对象级资源一样,二进制资源也是对象,但是其所在的位置不是在窗体上,一般在项目下的文件夹或者属性文件件下面。除此之外,因为控件查找资源时,会沿着逻辑树查找,如果在树上找不到资源,最后还会在Application.Resources里面找,所以越是靠上面的资源,能利用资源的元素越多。(可以理解为站的越高,越容易被更多的元素看到,因为元素都是往上看的)。&很多时间都有程序用到外部的文件,为了防止操作不当,使文件与程序分离,破坏了程序的完整性,所以让文件编译到目标文件中(.exe、.dll文件)以二进制的数据存在,这就是要记录的二进制资源。如果要添加的资源是字符串而不是文件,那么可以使用应用程序Properties名称空间中的Resources.resx资源文件,如果是XAML要访问该资源的话,要把访问修饰符改为Public。如图2
&在后台代码调用资源:
  Properties.Resources.Password
在XAML中调用形式:
xmlns:prop="clr-namespace:Chapter_08.Properties"
Text="{x:Static prop:Resources.Password}"
如果需要改为中文的话,可以直接去资源里面修改。该类资源便于国际化、本地化。除此之外还有一类就是文件型二进制资源。把文件编译成二进制文件,下面说一下具体的做法,在项目中添加一个文件夹Resources(可以是其他的名字)然后添加现有项,然后设置资源的属性的生成操作选项为:Resource,且复制到目录选项为:不复制,&如果不希望以资源的形式使用外部文件,那么生成操作选项为:None,复制到目录选择 :始终复制。
一种引用资源是在XAML中引用&Image x:Name="image" Source="Resources/Images/课程表.jpg" Stretch="Fill"/&
另一中引用时在cs后台代码中引用,其中有绝对路径和相对路径之分,下面列出两种形式:
//Uri imgUri1 = new Uri(@"Resources/Images/课程表.jpg", UriKind.Relative);
Uri imgUri1 = new Uri(@"pack://application:,,,/Resources/Images/课程表.jpg", UriKind.Absolute);
this.image.Source = new BitmapImage(imgUri1);
其中相对路径直接写程序下面的文件夹到文件的路径,绝对路径格式为pack://application,,,:[/程序集名][/可选版本号][/文件夹名]/文件名称。&
当然,随着资源被编译成二进制文件,所以生成的exe文件也变大了。
&  本文主要记录了对象资源和二进制资源以及动态资源和静态资源的区分,可以根据具体情况选择。本文是读书笔记,里面难免有理解不对的地方,欢迎讨论!下一篇:《深入浅出WPF》笔记&&模板篇。&
阅读(...) 评论()如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的),废话不多说,开始进入正题。本记录不是记录传统的事件(CLR事件),而是记录WPF中常用的事件&&路由事件,由于路由事件&传播&的时间是沿着可视树传播的,所以在记录开始之前还是了解一下逻辑树和可视树。
一、逻辑树和可视树
  在WPF中有两种树:逻辑树(Logical Tree)和可视树(Visual Tree),XAML是表达WPF的一棵树。逻辑树完全是由布局组件和控件构成。如果我们把逻辑树延伸至Template组件级别,我们就得到了可视树,所以可视树把树分的更细致。由于本记录重在记录事件,所以不做过多表述逻辑树和可视树的内容。关于逻辑树和可视树的区别可以参考。
二、路由事件
2.1、小记事件
  如果看完了委托与事件的文章,相信会对事件有更进一步的认识了,但还是要把一些基础的地方再记录一下。一个事件要有下面几个要素,才会变的有意义:
事件的拥有者(sender)&&即消息的发送者。
事件发送的消息(EventAgs)
事件的响应者&&消息的接收者(对象)。
响应者的处理器&&消息的接受者要对消息作出处理的方法(方法名)。
响应者对发送者事件的订阅
2.2 初试路由事件
  我们建立一个winform项目,然后在窗体上添加一个按钮,双击添加一个处理器,会发现private void btn_Click(object sender, EventArgs e)处理器要处理消息是EventArgs类型的,这里对应的是传统的事件(我们叫它CLR事件)。同样我们建立一个WPF项目,然后添加一个按钮,双击添加一个处理器,会发现private void Button_Click(object sender, RoutedEventArgs e)处理器要处理的消息是RoutedEventArgs类型的,这里对应的是路由事件。两者有什么区别呢。让我们先看看CLR事件的弊端,就如(this.btn.Click += new System.EventHandler(this.btn_Click);)每一个消息都是从发送到响应的一个过程,当一个处理器要用多次,必须建立显式的点对点订阅关系(窗体对按钮事件的订阅,如果是再有一个按钮的话,就要再来一次订阅);还有一个弊端是:事件的宿主必须能够直接访问事件的响应者,不然无法建立订阅关系(如有两个组件,点击组件一的按钮,想让组件二响应事件,那么就让组件二向组件一的按钮暴露一个可以访问的事件,这样如果再多几个嵌套,会出现事件链,有暴露如果暴露不当就存在着威胁)。路由事件除了能很好的解决上面的问题,还有一个是路由事件在有路的情况下,能很好的按照规定的方式传播事件,因为XAML的树状结构,构成了一条条的道路,所以在WPF中,引入了路由事件。举个例子:如果窗体要以相同的方式处理两个按钮的事件,我们就可以用一句代码就搞定了,this.AddHandler(Button.ClickEvent, new RoutedEventHandler(this.ButtonClicked));这样就减少代码量。下面通过一个例子初试一下路由事件。 给出XAML代码:
&Window x:Class="Chapter_06.MainWindow"
xmlns="/winfx/2006/xaml/presentation"
xmlns:x="/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"&
&Grid x:Name="GridRoot" Background="Lime"&
&Grid x:Name="gridA" Margin="10" Background="Blue"&
&Grid.ColumnDefinitions&
&ColumnDefinition/&
&ColumnDefinition/&
&/Grid.ColumnDefinitions&
&Canvas x:Name="canvasLeft" Grid.Column="0" Background="Red" Margin="10"&
&Button x:Name="buttonLeft" Content="left" Width="40" Height="100" Margin="10"/&
&Canvas x:Name="canvasRight" Grid.Column="1" Background="Yellow" Margin="10"&
&Button x:Name="buttonRight" Content="right" Width="40" Height="100" Margin="10" /&
  我们点击按钮时,无论是buttonLeft还是buttonRight单击都能显示按钮的名称。两个按钮到顶部的window有唯一条路,左边的按钮对应的路:buttonLeft-&canvasLeft-&gridA-&GridRoot-&Window,右边按钮对应的路:buttonRight-&canvasRight-&gridA-&GridRoot-&Window。如果GridRoot订阅两个处理器,那么处理器应该是相同的。后台代码为:
using System.Collections.G
using System.L
using System.T
using System.W
using System.Windows.C
using System.Windows.D
using System.Windows.D
using System.Windows.I
using System.Windows.M
using System.Windows.Media.I
using System.Windows.N
using System.Windows.S
namespace Chapter_06
/// &summary&
/// MainWindow.xaml 的交互逻辑
/// &/summary&
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
this.GridRoot.AddHandler(Button.ClickEvent,new RoutedEventHandler(this.ButtonClicked));
private void ButtonClicked(object sender, RoutedEventArgs e)
MessageBox.Show((e.OriginalSource as FrameworkElement).Name);
  下面先解释一下路由事件是怎么沿着可视树来传播的,当Button被点击,Button就开始发送消息了,可视树上的元素如果订阅了Button的点击事件,那么才会根据消息来作出相应的反应,如果没有订阅的话,就无视它发出的消息,当然我们还可以控制它的消息的传播方式,是从树根到树叶传播,还是树叶向树根传播以及是直接到达目的传播,不仅如此,还能控制消息传到某个元素时,停止传播。具体的会在后面记录到。其次是this.GridRoot.AddHandler(Button.ClickEvent,new RoutedEventHandler(this.ButtonClicked));订阅事件时,第一个参数是路由事件类型,在这里用的是Button的ClickEvent,就像依赖属性一样,类名加上依赖属性,这里是类名加上路由事件。另外一个是e.OriginalSource与e.Source的区别。由于消息每传一站,都要把消息交个一个控件(此控件成为了消息的发送地点),e.Source为逻辑树上的源头,要想获取原始发消息的控件(可视树的源头)要用e.OriginalSource。最后说明一下,怎么在XAML中添加订阅事件。直接用&Grid x:Name="gridA" Margin="10" Background="Blue" Button.Click="ButtonClicked"&在.net平台上不能智能提示Button,因为Click是继承与ButtonBase的事件,XAML只认识含有Click事件的元素,但是要大胆的写下去才能成功。运行上面代码,点击左边按钮,效果如图1:
默认的路由消息里面属性有四个,如图2,可以自行转到定义看一下其属性代表的意义。
2.3自定义路由事件
  通过上面的小试路由事件,应该对路由事件有些了解了,下面就记录一下如何自定义一个路由事件。大致分为三个步骤:1.声明并注册路由事件,2.为路由事件添加CLR事件包装,3.创建可以激发路由事件的方法。回忆一下依赖属性,前两个步骤应该和路由事件很相似吧。下面将三个步骤分开来说明:
第一步:声明并注册路由事件&&&&&&
//***Event为路由事件名,类型为路由事件类型
//注册事件用的是EventManager.RegisterRoutedEvent
//第一个参数为事件名(下面的***都为同一个单词)
//第二个参数为事件传播的策略,有三种策略:Bubble(冒泡式),Tunnel(隧道式),Direct(直达式)分别对应上面的三种青色字体的三种方式
//第三个参数用于指定事件处理器的类型,该类型必须为委托类型,并且不能为 null。
//第四个参数为路由事件的宿主
public static readonly RoutedEvent ***Event = EventManager.RegisterRoutedEvent("***", RoutingStrategy.Bubble,
typeof(***RouteEventHandler), typeof(ClassName));
第二步:为路由事件添加CLR事件包装
/*包装事件
*这里与传统的数据差别是把+=和-=换成了AddHandler和RemovedHandler
public event RoutedEventHandler ***
add { this.AddHandler(***Event, value); }
remove { this.RemoveHandler(***Event, value); }
第三步:创建可以激发路由事件的方法
/*对于控件的事件,一般是重写宿主事件对应的方法(如Button的click事件和OnClick()方法相对应):新建消息,并把消息与路由事件相关联,
*通过调用元素的RaiseEvent方法把时间传送出去(这里与包装器的CRL事件毫不相干),在CLR事件是用Invoke方法,下面以按钮为例
protected override void OnClick()
base.OnClick();
***EventArgs args = new ***EventArgs(***Event, this);
this.RaiseEvent(args);
下面我们就来实现一个简单的自定义路由功能,当路由飘过一个控件的时间,显示通过该控件的时间。 上面介绍的差不多了,所以就直接上代码,有需要解释的话,再一个个解释。
下面是XAML代码:
&Window x:Class="DefineEvent.MainWindow"
xmlns="/winfx/2006/xaml/presentation"
xmlns:x="/winfx/2006/xaml"
xmlns:local="clr-namespace:DefineEvent"
Title="Routed Event" x:Name="window_1" Height="350" Width="525" local:TimeButton.ReportTime="ReportTimeHandler" &
&Grid x:Name="grid_1" local:TimeButton.ReportTime="ReportTimeHandler" &
&Grid x:Name="grid_2" local:TimeButton.ReportTime="ReportTimeHandler"
&Grid x:Name="grid_3" local:TimeButton.ReportTime="ReportTimeHandler"
&StackPanel x:Name="stackPanel_1" local:TimeButton.ReportTime="ReportTimeHandler" &
&ListBox x:Name="listBox" /&
&local:TimeButton x:Name="timeButton" Width="200" Height="80" Content="显示到达某个位置的时间" ReportTime="ReportTimeHandler"/&
&/StackPanel&
下面是CS代码
using System.Collections.G
using System.L
using System.T
using System.W
using System.Windows.C
using System.Windows.D
using System.Windows.D
using System.Windows.I
using System.Windows.M
using System.Windows.Media.I
using System.Windows.N
using System.Windows.S
using ponentM
namespace DefineEvent
/// &summary&
/// MainWindow.xaml 的交互逻辑
/// &/summary&
delegate void ReportTimeRouteEventHandler(object sender, ReportTimeEventArgs e);
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
private void ReportTimeHandler(object sender, ReportTimeEventArgs e)
FrameworkElement element = sender as FrameworkE
string timeStr = e.ClickTime.ToString("yyyyMMddHHmmss");
string content = string.Format("{0}到达{1}", timeStr, element.Name);
this.listBox.Items.Add(content);
//创建消息类型,在此可以附加自己想要的信息
public class ReportTimeEventArgs : RoutedEventArgs
public ReportTimeEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source) { }
public DateTime ClickTime { get; set; }
public class TimeButton : Button
//1、为元素声明并注册事件
public static readonly RoutedEvent ReportTimeEvent = EventManager.RegisterRoutedEvent("ReportTime", RoutingStrategy.Bubble,
typeof(ReportTimeRouteEventHandler), typeof(TimeButton));
//2、包装事件
public event RoutedEventHandler ReportTime
add { this.AddHandler(ReportTimeEvent,value); }
remove { this.RemoveHandler(ReportTimeEvent,value); }
//3、创建激发事件的方法
protected override void OnClick()
base.OnClick();
ReportTimeEventArgs args = new ReportTimeEventArgs(ReportTimeEvent,this);
args.ClickTime = DateTime.N
this.RaiseEvent(args);
运行单击按钮的效果为图3:
  注意下面的一行代码,在声明和定义路由事件时,第三个参数,委托的类型和处理器方法的的参数一定要相同,不然会报错,可以把下面一句中的ReportTimeRouteEventHandler换成RoutedEventHandler试试,会出现:无法从文本&ReportTimeHandler&创建&ReportTime&。&,行号为&5&,行位置为&30&,的问题,这里主要的原因就是委托的参数和RoutedEventHandler的参数不一致,虽然都是(sender,& e);但是e的类型已经发生了变化,成为了ReportTimeEventArgs类型的。所以在使用之前,声明一个委托就可以了。还有个方法是使用EventHandler&ReportTimeEventArgs&替换ReportTimeRouteEventHandler,其实二者的用法差不多,只是不同的写法,但是是我感觉第一种写法会更好理解。具体关于EventHandler&ReportTimeEventArgs&的含义请参考。我们同样可以使用让第二个参数改变成另外两种类型的看看测试结果。
public static readonly RoutedEvent ReportTimeEvent = EventManager.RegisterRoutedEvent("ReportTime", RoutingStrategy.Tunnel,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& typeof(ReportTimeRouteEventHandler), typeof(TimeButton));
如果我们希望当事件传递到grid_2上面就停止了,我们可以这样做:在ReportTimeHandler函数中添加代码。
if (element.Name == "grid_2")
&&& e.Handled = true;
  本篇记录的内容虽然不多,但是感觉记录的时间特别费力,主要是因为对事件的几个组成部分还不是非常熟练,而且在理解路由事件时,还要先理解逻辑树与可视树。最终还是把这一章看完了,但这个只是开始。
  文章主要记录了路由事件的在可视树上的传播以及自定义路由事件的实现。如果在文章有不同的见解或建议,欢迎交流! 下一篇:《深入浅出WPF》笔记&&命令篇
阅读(...) 评论() &1779人阅读
2从零开始认识Xaml
关于编译器
首先由程序员使用变成语言编写源代码,然后通过编译器将源代码编译成成品程序,编译器也是一种程序,他的主要职责是将源代码编译成目标程序,在整个编译过程中,编译器会根据他获得的指令(相应的参数)编译成相应的程序。
/t:exe(Console Application);/t:winexe(GUI Application);/t:library(动态链接库 Dynamic Link Library)
关于命名空间
xmlns语法格式,xmlns[:可选的映射前缀]=&命名空间&,没有映射前最的命名空间是默认命名空间,并且只有一个,在xaml添加程序集的引用,xmlns:x="clr-namespace:System.Windows.Cassembly=PresentationFramework"。命名空间是xaml解析器的硬性编码(hard-coding)没有任何意义,解析器只要看见它就会一系列必要的程序集(Assembly)和程序集中包含的.NET命名空间引用进来。
例如命名空间/winfx/2006/xaml/presentation就对应了好对程序和.NET命名空间。
System.Windows
System.Windows.Automation
System.Windows.Controls
System.Windows.Controls.Primitives
System.Windows.Data
System.Windows.Documents
System.Windows.Forms.Integration
System.Windows.Ink
System.Windows.Input
System.Windows.Media
System.Windows.Media.Animation
System.Windows.Media.Effects
System.Windows.Media.Imaging
System.Windows.Media.Media3D
System.Windows.Navigation
System.WIndows.Shapes
而http:/winfx/2006/xaml与一些XAML语法和编译器有关的CLR名称空间,习惯使用X作为映射前缀
x:Class的意思就是当Xaml解析器将包含它的标签解析成C#类以后,这个类的类名是什么
3系统学习XAML语法
TypeConventer
使用TypeConventer类将XAML标签的Attribute与对象的property进行映射
转换类需要继承TypeConventer,并且重载ConvertFrom方法。最后将自定义数据类型前面加上[TypeConventerAttribute(typeof(转换类))]&
属性标签:
标签内容就是夹在起始标签和结束标签之间的一些子级标签。属性标签有些默认值可以省略
&LinearGradientBrush.StartPoint&&LinearGradientBrush.EndPoint& -default "0,0""1,1"
&LinearGradientBrush.GradientStops&子标签是&GradientStopCollection& 可以省略
StackPanel的Orientation=&Vertical&可以省略
扩展标记:
只有MarkupExtension的派生类才能使用扩展标记语法来创建对象。扩展标记属性之间用逗号连接,属性值不用加引号
扩展标记可以嵌套Text=&{Binding Source={StaticResource mySource}, Path=Name}&
扩展标记简写语法{Binding Value}等价于{Binding Path=Value};{StaticResource mySource}等价于{Binding ResourceKey=mySource},固定位置参数实际上就是扩展标记类的构造函数的参数,其位置有构造器参数列表决定。
扩展标记以Extension为后缀。Text="{x:Static}"等价于Text="{x:StaticExtension}"
4X名称空间详解
&x名称空间就是Xaml的首字母缩写。即是http:/winfx/2006/xaml。它包含一些关于XAML语法和编译器的相关的,它包含的类均与解析XAML有关,所以成XAML名称空间。
x名称空间中的Attribute
x:Class 与后台代码指定的Partial类合并
x:ClassModifier XAML编译器生成的类具有怎样的访问级别,需要与partial类一致
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3801次
排名:千里之外}

我要回帖

更多关于 深入浅出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信