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。

 1 using System;
 2 using System.Windows;
 3 using System.Windows.Controls;
 4
 5 namespace ConsoleApplication1
 6 {
 7     class Program
 8     {
 9         [STAThread]
10         static void Main(string[] args)
11         {
12             var b = new Button { Content="Click Me!" };
13             var w = new Window { Title="Code Demo",Content=b };
14
15             var app = new Application();
16             app.Run(w);
17         }
18     }
19 }

同样的效果由XAML实现,代码如下:

 1 <Window x:Class="XMAL.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:XMAL"
 7         mc:Ignorable="d"
 8         Title="XAML Demo" Height="350" Width="525">
 9     <StackPanel x:Name="stackPanel1">
10         <Button Content="Click Me!"></Button>
11         <!--<Button Content="Click Me!" Height="200">
12             <Button.Background>
13                 <LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">
14                     <GradientStop Offset="0" Color="Yellow"></GradientStop>
15                     <GradientStop Offset="0.3" Color="Orange"></GradientStop>
16                     <GradientStop Offset="0.7" Color="Red"></GradientStop>
17                     <GradientStop Offset="1.0" Color="DarkRed"></GradientStop>
18                 </LinearGradientBrush>
19             </Button.Background>
20         </Button>-->
21         <!--<Button Name="button1" Content="Button 1" Margin="5" />
22         <Button x:Name="button2" Margin="5" Click="OnButton2">
23             <ListBox Name="listBox1">
24                 <Button x:Name="innerButton1" Content="Ihner Button 1" Margin="4" Padding="4" Click="OnInner1" />
25                 <Button x:Name="innerButton2" Content="Inner Button 2" Margin="4" Padding="4" Click="OnInner2" />
26             </ListBox>
27         </Button>-->
28         <!--<DockPanel>
29             <Button Content="Top" DockPanel.Dock="Top" Background="Yellow"></Button>
30             <Button Content="Top" DockPanel.Dock="Left" Background="Blue"></Button>
31         </DockPanel>-->
32     </StackPanel>
33 </Window>

当然Application的实例也可以在XAML中定义

1 <Application x:Class="XMAL.App"
2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4              xmlns:local="clr-namespace:XMAL"
5              StartupUri="MainWindow.xaml">
6     <Application.Resources>
7     </Application.Resources>
8 </Application>

  1.2 使用自定义.net类

  首先定义一个简单的Person类,包含2个属性,FirstName和LastName;

 1 namespace XMAL
 2 {
 3     class Person
 4     {
 5         public Person()
 6         {
 7             FirstName = "one";
 8             LastName = "two";
 9         }
10
11         public string FirstName { get; set; }
12         public string LastName { get; set; }
13
14         public override string ToString()
15         {
16             return string.Format("{0}, {1}", FirstName, LastName);
17         }
18     }
19 }

然后在XAML文件中引入Person类的命名,空间起别名为Local可以看到有很多的.net命名空间可以引用,引入明明空间后,写XAML代码

1    <ListBox>
2             <Local:Person FirstName="12" LastName="34"></Local:Person>
3         </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

 1 public class DemoDependencyObject : DependencyObject
 2     {
 3         public static readonly DependencyProperty ValueProperty =
 4             DependencyProperty.Register("Value", typeof(int), typeof(DemoDependencyObject));
 5
 6         public int Value
 7         {
 8             get { return (int)GetValue(ValueProperty); }
 9             set { SetValue(ValueProperty, value); }
10         }
11     }

DemoDependencyObject

2.2强制值回掉
  依赖属性支持强制检查,由此来判断属性的值是否有效,即Register方法的第4个构造,传递一个PropertyMetadatalei类,在CoerValue方法中写入自己的额Code;

 1  public static readonly DependencyProperty ValueProperty =
 2             DependencyProperty.Register("Value", typeof(int), typeof(DemoDependencyObject),new PropertyMetadata(0,null, CoerValue));
 3         private static object CoerValue(DependencyObject elemnet, object value)
 4         {
 5             //your code
 6             //int newValue = (int)value;
 7             //MyDependencyObject control = (MyDependencyObject)elemnet;
 8             //newValue = Math.Max(control.Minimun, Math.Min(control.Maximun, newValue));
 9             //return newValue;
10         }

  2.3 值变更回掉和事件

  为 了 获 得 值 变 更 的信 息 ,依 赖 属 性还支 持值 变 更 回 调 。 在 属 性 值 发 生 变 化 时调 用 的DependencyProperty.Register()方 法中,可 以添加一个 DependencyPropeGhanged事件处理程序 。

1 public static readonly DependencyProperty ValueProperty =
2             DependencyProperty.Register("Value", typeof(int), typeof(MyDependencyObject), new PropertyMetadata(0, OnValueChanged, CoerValue));
3
4         public static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
5         {
6             int oldValue = (int)args.OldValue;
7             int newValue = (int)args.NewValue;
8             ///your code
9         }

3 附加属性

1  <DockPanel>
2         <Button Content="Top" DockPanel.Dock="Top" Background="Yellow"></Button>
3         <Button Content="Left" DockPanel.Dock="Left" Background="Blue"></Button>
4     </DockPanel>

纳尼,什么鬼,DockPanel.Dock是Button的属性?Button并没有Dock属性,他是通过DockPanel空间附加给Button,为其正起名曰附加属性。附加属性的定义和依赖属性很相似,它是调用RegisterAttached()方法,

 1  class MyAttachedPropertyProvide : DependencyObject
 2     {
 3         public static readonly DependencyProperty myPropertyProperty =
 4             DependencyProperty.RegisterAttached("MyProperty", typeof(int), typeof(MyAttachedPropertyProvide));
 5         public int MyProperty
 6         {
 7             get { return (int)GetValue(myPropertyProperty); }
 8             set { SetValue(myPropertyProperty,value); }
 9         }
10         public static void SetMyProperty(UIElement element,int value)
11         {
12             element.SetValue(myPropertyProperty,value);
13         }
14         public static int GetMyProperty(UIElement element
15         {
16            return (int)element.GetValue(myPropertyProperty);
17         }
18     }

MyAttachedPropertyProvide

似乎DockPanel.Dock属性只能添加到DockPanel中的控件上,实际上,附加属性可以添加到任何元素上,但是无法识别这个属性值。

 1 <Window x:Class="XMAL.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:Local="clr-namespace:XMAL"
 7         mc:Ignorable="d"
 8         Title="XAML Demo" Height="350" Width="525">
 9     <Grid x:Name="grid">
10         <Grid.RowDefinitions>
11             <RowDefinition Height="auto"></RowDefinition>
12             <RowDefinition Height="auto"></RowDefinition>
13             <RowDefinition Height="*"></RowDefinition>
14         </Grid.RowDefinitions>
15         <Button Grid.Row="0" x:Name="button1" Content="Button1"></Button>
16         <Button Grid.Row="0" x:Name="button2" Content="Button2"
17                 Local:MyAttachedPropertyProvide.MyProperty="5"></Button>
18         <ListBox Grid.Row="2" x:Name="list1"></ListBox>
19     </Grid>
20 </Window>

C#的使用

1  public MainWindow()
2         {
3             InitializeComponent();
4
5             MyAttachedPropertyProvide.SetMyProperty(button1, 44);
6
7             list1.Items.Add(MyAttachedPropertyProvide.GetMyProperty(button1));
8         }       

4 标记扩展

通过标记扩展 ,可 以扩展 XAML的 元素或特性语法 。 如果 XML特 性包含花括号,就表示这是标记扩展 的一个符号 。 特性的标记扩展常常用 作简写记号,而 不再使用 元素 。如StaticResourcrce
要创 建标记扩展 ,可 以定义一个派生 自基类 MarkupExtension的 类 。 大 多数标记扩展名 都有Extension后缀,有 了 自定义标记扩展后 ,就只需重写ProvideeValue()方 法 ,它 返回扩展的值 .返回的类型用MarkupExtensionReturnType注解。

 1    public enum Operation { Add, Subtract, Multiply, Divide }
 2     [MarkupExtensionReturnType(typeof(string))]
 3     public class CalculatorExtension : MarkupExtension
 4     {
 5         public CalculatorExtension() { }
 6
 7         public double X { get; set; }
 8         public double Y{ get; set; }
 9         public Operation operation { get; set; }
10         public override object ProvideValue(IServiceProvider serviceProvider)
11         {
12             IProvideValueTarget provideValue = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
13             if (provideValue != null)
14             {
15                 var host = provideValue.TargetObject as FrameworkElement;
16                 var prop = provideValue.TargetObject as DependencyProperty;
17             }
18             double result = 0;
19             switch (operation)
20             {
21                 case Operation.Add:
22                     result = X + Y;
23                     break;
24                 case Operation.Subtract:
25                     result = X - Y;
26                     break;
27                 case Operation.Multiply:
28                     result = X * Y;
29                     break;
30                 case Operation.Divide:
31                     result = X / Y;
32                     break;
33                 default:
34                     throw new ArgumentException("error");
35             }
36             return result;
37         }
38     }

CalculatorExtension

 1 <Window x:Class="XMAL.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:Local="clr-namespace:XMAL"
 7         mc:Ignorable="d"
 8         Title="XAML Demo" Height="350" Width="525">
 9     <StackPanel>
10         <TextBlock Text="{Local:Calculator operation=Add,X=3,Y=4}"/>
11         <TextBlock>
12             <TextBlock.Text>
13                 <Local:CalculatorExtension>
14                     <Local:CalculatorExtension.operation>
15                         <Local:Operation>Multiply</Local:Operation>
16                     </Local:CalculatorExtension.operation>
17                     <Local:CalculatorExtension.X>7</Local:CalculatorExtension.X>
18                     <Local:CalculatorExtension.Y>11</Local:CalculatorExtension.Y>
19                 </Local:CalculatorExtension>
20             </TextBlock.Text>
21         </TextBlock>
22     </StackPanel>
23 </Window>

5 XAML定义的标记扩展

用 XAML定 义 的其他标记扩展有 TypeExtension(x:Type) ,它 根据字符 串输入返 回类 型 ;NullExtension(x:Null),它 可以用于在 XAML 中把值设置为空;StaticExtension(x:static),它 可调用类的静态成员。 

未完待续。。。。。。。

时间: 2024-10-11 17:21:34

XAML基础(一)的相关文章

一,XAML基础

RuntimeNameProperty特性:为什么<Grid x:Name="grid1"></Grid>等价于<Grid Name="grid1"></Grid>,是因为Grid类使用RuntimeNameProperty特性进行了修饰,  RuntimeNameProperty特性指示哪个属性的值将被做为该类型的实例的名称. WPF的类型转换器:XAML解析器通过以下的两个方法查找类型转换器,如果找不到,XAML解

Windows Phone 一、XAML基础语法

XAML的命名空间 命名空间格式:语法结构为“xmlns:”+“命名空间前缀名”,默认命名空间无需定义命名空间前缀名“xmlns” 命名空间的声明 <Page x:Class="App1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quo

C#人事管理系统 第一天.NET难点加强及XAML基础

sender:代表本控件 Button btn1=(Button)sender;//拿到本控件 btn1.Text=”button控件显示的名字”; 集合类: List<int> list1=new List<int>; list1.Add(11); list1.Add(22); //将数字22添加到集合list1中 类似于数组,但其中存储方式为链表,效率上不如数组 优点:可变长度 数组: int[] a1=new int[2]; a1[0]=11; a1[1]=22; 集合类其它

3.移动先行之谁主沉浮----XAML基础知识

如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 参考:https://msdn.microsoft.com/zh-cn/library/windows/apps/hh700354.aspx

WPF 基础到企业应用系列5——WPF千年轮回 续前缘

一.摘要 首先非常高兴这个系列能得到大家的关注和支持,前端时间身体状况不适,所以暂停了更新,对此表示非常抱歉,以后会逐渐加快进度.只是因为这是一个非常长的系列,我也想把它写好,所以以后也会慢慢来,在这个系列的过程中也会穿插发一些其它文章,比方Windows Azure.设计模式.WCF.Silverlight等,同一时候也会发一些自己的技术随感和心得.反正仅仅要自己写得开心且对大家有帮助即可.因为自己才疏学浅且是对这些技术的使用总结和心得体会.错误之处在所难免.怀着技术交流的心态,在这里发表出来

【WPF学习】第一章 XAML介绍

XAML(Extensible Application Markup Language的简写,发音为“zammel”)是用于实例化.NET对象的标记语言.尽管XAML是一种应用于诸多不同问题领域的技术,但其主要作用是构造WPF用户界面.换言之,XAML文档定义了在WPF应用程序中组成窗口的面板.按钮以及各种空间的布局. 一.XAML变体 实际上术语“XAML”有多种含义.到目前为止,我们使用XAML标识整个XAML语言,它是一种基于通用XML语法.专门用于表示一颗.NET对象树的语言(这些对象可

拒绝低调,国内首家推出微软WP8.1移动开发全套免费课程

活动类型:公开课 开始时间:2014-10-20 20:00 活动地点:YY频道:85155393 课程简介:学习本次公开课你将收获和体会到:      Windwos Phone8.1的推出正是微软向吹响了WP8崛起的号角,而且匮乏的学习资料是挡在我们面前的大山,传智播客高级讲师蒋坤老师带您从零基础学习整套Windows Phone开发的教程,教程涵盖了XAML基础.数据绑定.WP控件详解.MVVM模式.WP的状态保持机制.WP的音视频开发.WP手势开发.WP设备操作开发.消息推送机制.地图开

转载--我与英语技术书籍

原文:http://www.cnblogs.com/KnightsWarrior/p/EnglishTechBooks.html 我与英语技术书籍 2013-09-05 00:01 by 圣殿骑士, 17877 阅读, 122 评论, 收藏, 编辑 前言(Introduction) 前些天写了一篇<程序猿也爱学英语(上),有图有真相>,大概介绍了我学英语的一些基本资料以及心得体会,本来接下来该发中篇,但<程序猿也爱学英语(中),有图有真相>实在太长,为了方便读者阅读以及多方面考虑,

Silverlight 之 浅析

一.silverlight定义及作用 silverlight用XAML来做前端界面,用.NET或者JS作为程序脚本支持,在浏览器内外运行的应用.可以认为和FLASH 和ADOBE AIR有很大的功能重叠.当然他能做大部分flash或者air程序的工作. 二.silverlight知识层次 包括控件.布局.多媒体.XAML基础.属性和事件.数据.网络.调试等等. Silverlight的界面可以用XAML和C#(或者其他)写.一般都用XAML,所以要先介绍XAML.       用2010新建一个