XAML基础(一)
1.0 XAML是啥?
XAML(eXtensible Application Markup Language,可 扩展应用 程序标记语言) 是一种声明性的XML语法 ,像WPF,WF或者Silverlight应用程序通常需要 XAML。Xaml元 素通常映射到,NET类 。 这并不是一个严格的要求 ,但通常都是如此。
1.1 元素 映射到 .net对 象上
一个控制台Demo,需 要引用程序集 PresntationFramework、 PresentatioCore、 WhdowBase和 system.Xaml。
using System; using System.Windows; using System.Windows.Controls; namespace ConsoleApplication1 { class Program { [STAThread] static void Main(string[] args) { var b = new Button { Content="Click Me!" }; var w = new Window { Title="Code Demo",Content=b }; var app = new Application(); app.Run(w); } } }
同样的效果由XAML实现,代码如下:
<Window x:Class="XMAL.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:XMAL" mc:Ignorable="d" Title="XAML Demo" Height="350" Width="525"> <StackPanel x:Name="stackPanel1"> <Button Content="Click Me!"></Button> <!--<Button Content="Click Me!" Height="200"> <Button.Background> <LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0"> <GradientStop Offset="0" Color="Yellow"></GradientStop> <GradientStop Offset="0.3" Color="Orange"></GradientStop> <GradientStop Offset="0.7" Color="Red"></GradientStop> <GradientStop Offset="1.0" Color="DarkRed"></GradientStop> </LinearGradientBrush> </Button.Background> </Button>--> <!--<Button Name="button1" Content="Button 1" Margin="5" /> <Button x:Name="button2" Margin="5" Click="OnButton2"> <ListBox Name="listBox1"> <Button x:Name="innerButton1" Content="Ihner Button 1" Margin="4" Padding="4" Click="OnInner1" /> <Button x:Name="innerButton2" Content="Inner Button 2" Margin="4" Padding="4" Click="OnInner2" /> </ListBox> </Button>--> <!--<DockPanel> <Button Content="Top" DockPanel.Dock="Top" Background="Yellow"></Button> <Button Content="Top" DockPanel.Dock="Left" Background="Blue"></Button> </DockPanel>--> </StackPanel> </Window>
当然Application的实例也可以在XAML中定义
<Application x:Class="XMAL.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:XMAL" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>
1.2 使用自定义.net类
首先定义一个简单的Person类,包含2个属性,FirstName和LastName;
namespace XMAL { class Person { public Person() { FirstName = "one"; LastName = "two"; } public string FirstName { get; set; } public string LastName { get; set; } public override string ToString() { return string.Format("{0}, {1}", FirstName, LastName); } } }
然后在XAML文件中引入Person类的命名,空间起别名为Local可以看到有很多的.net命名空间可以引用,引入明明空间后,写XAML代码
<ListBox> <Local:Person FirstName="></Local:Person> </ListBox>
运行程序,ToString()方法就把对象的值显示在列表中。(如果没有TOstring方法则显示的是这个对象)
1.3 把特性用作属性
只要属性的类型可以表示为字符 串,或者可以把字符串转换为特属性型,就可以把属性设置为属性。 下面 的代码段用特性设置 了 Button元 素 的 Content和Backgromd属 性 。 因为 Content属性的类型是 object,所以可 以接受字符串 。 Background属性的类型是 Brush,Brush类型把 BrushConvener类定义为一个转换器类型,这个类用 Typeconvmer特性进行注解 。 BrushConvener使用 一个颜色列表,从 ConverFormString()方法中返回一个SolidColorBrush。<Button Content="Click Me!" Background="Aqua"></Button>
1.4 把特性用作元素
总是可 以使用 元素语法给属性提供值 。 Button类 的 Backgromd属性可以用子元素 Button.Background设 置。 这样,可以把比较复杂的画笔应用于这个属性,
2 依赖属性
2.1 创建依赖属性
WPF使 用 依赖属性完成数据绑定、 动画、 属性变更通知 、 样式化等 。 对于数据绑定,绑 定到.NET属性源上 的 t1I元 素 的属性必须是依赖属性 。依赖属性和.net的属性一样也包含Get和Set访问器,但是依赖属性调用了基类DependencyObject的GetValue()和SetValue()方法,这2个方法都需要一个参数,参数为属性名+Proprty,基类通过Register()方法注册属性,上demo
public class DemoDependencyObject : DependencyObject { public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(DemoDependencyObject)); public int Value { get { return (int)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } }
DemoDependencyObject
2.2强制值回掉
依赖属性支持强制检查,由此来判断属性的值是否有效,即Register方法的第4个构造,传递一个PropertyMetadatalei类,在CoerValue方法中写入自己的额Code;
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(,null, CoerValue)); private static object CoerValue(DependencyObject elemnet, object value) { //your code //int newValue = (int)value; //MyDependencyObject control = (MyDependencyObject)elemnet; //newValue = Math.Max(control.Minimun, Math.Min(control.Maximun, newValue)); //return newValue; }
2.3 值变更回掉和事件
为 了 获 得 值 变 更 的信 息 ,依 赖 属 性还支 持值 变 更 回 调 。 在 属 性 值 发 生 变 化 时调 用 的DependencyProperty.Register()方 法中,可 以添加一个 DependencyPropeGhanged事件处理程序 。
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(, OnValueChanged, CoerValue)); public static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { int oldValue = (int)args.OldValue; int newValue = (int)args.NewValue; ///your code }
3 附加属性
<DockPanel> <Button Content="Top" DockPanel.Dock="Top" Background="Yellow"></Button> <Button Content="Left" DockPanel.Dock="Left" Background="Blue"></Button> </DockPanel>
纳尼,什么鬼,DockPanel.Dock是Button的属性?Button并没有Dock属性,他是通过DockPanel空间附加给Button,为其正起名曰附加属性。附加属性的定义和依赖属性很相似,它是调用RegisterAttached()方法,
class MyAttachedPropertyProvide : DependencyObject { public static readonly DependencyProperty myPropertyProperty = DependencyProperty.RegisterAttached("MyProperty", typeof(int), typeof(MyAttachedPropertyProvide)); public int MyProperty { get { return (int)GetValue(myPropertyProperty); } set { SetValue(myPropertyProperty,value); } } public static void SetMyProperty(UIElement element,int value) { element.SetValue(myPropertyProperty,value); } public static int GetMyProperty(UIElement element { return (int)element.GetValue(myPropertyProperty); } }
MyAttachedPropertyProvide
似乎DockPanel.Dock属性只能添加到DockPanel中的控件上,实际上,附加属性可以添加到任何元素上,但是无法识别这个属性值。
<Window x:Class="XMAL.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:Local="clr-namespace:XMAL" mc:Ignorable="d" Title="XAML Demo" Height="350" Width="525"> <Grid x:Name="grid"> <Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <Button Grid.Row="0" x:Name="button1" Content="Button1"></Button> <Button Grid.Row="0" x:Name="button2" Content="Button2" Local:MyAttachedPropertyProvide.MyProperty="5"></Button> <ListBox Grid.Row="2" x:Name="list1"></ListBox> </Grid> </Window>
C#的使用
public MainWindow() { InitializeComponent(); MyAttachedPropertyProvide.SetMyProperty(button1, ); list1.Items.Add(MyAttachedPropertyProvide.GetMyProperty(button1)); }
4 标记扩展
通过标记扩展 ,可 以扩展 XAML的 元素或特性语法 。 如果 XML特 性包含花括号,就表示这是标记扩展 的一个符号 。 特性的标记扩展常常用 作简写记号,而 不再使用 元素 。如StaticResourcrce
要创 建标记扩展 ,可 以定义一个派生 自基类 MarkupExtension的 类 。 大 多数标记扩展名 都有Extension后缀,有 了 自定义标记扩展后 ,就只需重写ProvideeValue()方 法 ,它 返回扩展的值 .返回的类型用MarkupExtensionReturnType注解。
public enum Operation { Add, Subtract, Multiply, Divide } [MarkupExtensionReturnType(typeof(string))] public class CalculatorExtension : MarkupExtension { public CalculatorExtension() { } public double X { get; set; } public double Y{ get; set; } public Operation operation { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { IProvideValueTarget provideValue = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if (provideValue != null) { var host = provideValue.TargetObject as FrameworkElement; var prop = provideValue.TargetObject as DependencyProperty; } ; switch (operation) { case Operation.Add: result = X + Y; break; case Operation.Subtract: result = X - Y; break; case Operation.Multiply: result = X * Y; break; case Operation.Divide: result = X / Y; break; default: throw new ArgumentException("error"); } return result.ToString(); } }
CalculatorExtension
<Window x:Class="XMAL.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:Local="clr-namespace:XMAL" mc:Ignorable="d" Title="XAML Demo" Height="350" Width="525"> <StackPanel> <TextBlock Text="{Local:Calculator operation=Add,X=3,Y=4}"/> <TextBlock> <TextBlock.Text> <Local:CalculatorExtension> <Local:CalculatorExtension.operation> <Local:Operation>Multiply</Local:Operation> </Local:CalculatorExtension.operation> <Local:CalculatorExtension.X>7</Local:CalculatorExtension.X> <Local:CalculatorExtension.Y>11</Local:CalculatorExtension.Y> </Local:CalculatorExtension> </TextBlock.Text> </TextBlock> </StackPanel> </Window>
5 XAML定义的标记扩展
用 XAML定 义 的其他标记扩展有 TypeExtension(x:Type) ,它 根据字符 串输入返 回类 型 ;NullExtension(x:Null),它 可以用于在 XAML 中把值设置为空;StaticExtension(x:static),它 可调用类的静态成员。
未完待续。。。。。。。
XAML基础(一)的更多相关文章
- Xamarin.Forms移动开发系列4 :XAML基础
摘要 本文介绍Xamarin.Forms创建用户界面的语言:XAML基础部分. 前言 本文介绍Xamarin.Forms定义用户界面的语言:XAML. 本篇篇幅较长,主要讲述XAML语法,以及对其他基 ...
- WPF学习里程(二) XAML基础
1.什么是XAML? 官方语言: XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用 ...
- Windows Phone 一、XAML基础语法
XAML的命名空间 命名空间格式:语法结构为“xmlns:”+“命名空间前缀名”,默认命名空间无需定义命名空间前缀名“xmlns” 命名空间的声明 <Page x:Class="App ...
- XAML基础
1.标记扩展 将一个对象的属性值依赖在其他其他对象的某个属性上 用法:标记属性的一般用法是:Attribute = Value,使用标记拓展,Value字符串是由一对花括号及其括起来的内容组成,XAM ...
- 一,XAML基础
RuntimeNameProperty特性:为什么<Grid x:Name="grid1"></Grid>等价于<Grid Name="gr ...
- WPF系列(1)WPF和XAML基础
终于下定决心开始更新WPF一个系列的文章,这里主要是出于两个目的,一是自己对所学的知识有一个系统的总结,二十希望能对其他人有些帮助,如果您觉得我写的不好,欢迎提意见. 那么既然我要开始写WPF,那我们 ...
- WPF学习笔记1——XAML之1
参考文献: http://msdn.microsoft.com/zh-cn/library/ms752059(v=vs.110).aspx <Pro WPF 4.5 in C# > 一.X ...
- 什么是XAML?
XAML类似于XML一样的一种标记语言,主要用来设计UI. 对于XAML的历史,哪些都是废话了,至于Microsoft怎么整出XAML,然后,又怎么让XAML来开发windows 8应用程序,这些,都 ...
- Win10系列:UWP界面布局基础1
随着技术的不断发展,使用者对应用程序的界面体验提出了更高的要求,为了应对越来越复杂的界面设计需求和有效的简化界面开发过程,微软公司在其应用程序的开发技术当中引入一套新的应用程序界面描述语言,这就是XA ...
随机推荐
- 了解sota字符界面(章节4.1)
4 SOTA操作 4.1 SOTA字符界面 sotaCC是字符界面管理sota系统程序 . 在/.../sota/bin/目录下,启动sotaCC.在终端的该目录下输入指令“./sotaCC”,启动s ...
- 网页class命名规范
CSS样式命名整理 页面结构 容器: container/wrap 总体宽度:wrapper 页头:header 内容:content 页面主体:main 页尾:footer 导航:nav 側栏:si ...
- Qt+gsoap调用WebService
1. 前言 Qt本身给我们提供了调用WebService的解决方案qsoap,看了一下他的介绍,感觉实在是太弱了,而且又是个新出的东西,所以还是决定不用他.既然使用Qt,那当然是跨平台的解 ...
- 根据图像路径,创建CBitmap对象的方法
因为项目的关系,需要根据图像路径,创建CBitmap对象.起初查资料找到了LoadBitmap这个函数,根据CSDN得 BOOL LoadBitmap ( LPCTSTR lpszResourceNa ...
- JSP中两种include的区别
首先说明这两种都是什么: <%@ include file=”relativeURI”%> 可以叫作静态include(静态包含),是jsp指令中的一种,(JSP指令控制JSP编译器如何去 ...
- c friend -- 友元
c friend -- 友元 友元用于突破protected 或者 private 保护的限制,首先要做的是在被访问者的类中声明是友元函数或者友元类.代码如下 #include <iostrea ...
- Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot
Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot Lisp: Common Lisp, Racket, Clojure, E ...
- 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)
1,回调函数工作机制 回调函数由操作系统自动调用,回调函数的返回值当然也是返回给操作系统了. 2,截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,已达到欺骗操作系统的目的. 下面还是以 ...
- 编程算法 - 萨鲁曼的军队(Saruman's Army) 代码(C)
萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每个点, 其距离为R以内的区域里 ...
- HDU 4704 Sum (费马定理+快速幂)
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...