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基础(一)的更多相关文章

  1. Xamarin.Forms移动开发系列4 :XAML基础

    摘要 本文介绍Xamarin.Forms创建用户界面的语言:XAML基础部分. 前言 本文介绍Xamarin.Forms定义用户界面的语言:XAML. 本篇篇幅较长,主要讲述XAML语法,以及对其他基 ...

  2. WPF学习里程(二) XAML基础

    1.什么是XAML? 官方语言: XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用 ...

  3. Windows Phone 一、XAML基础语法

    XAML的命名空间 命名空间格式:语法结构为“xmlns:”+“命名空间前缀名”,默认命名空间无需定义命名空间前缀名“xmlns” 命名空间的声明 <Page x:Class="App ...

  4. XAML基础

    1.标记扩展 将一个对象的属性值依赖在其他其他对象的某个属性上 用法:标记属性的一般用法是:Attribute = Value,使用标记拓展,Value字符串是由一对花括号及其括起来的内容组成,XAM ...

  5. 一,XAML基础

    RuntimeNameProperty特性:为什么<Grid x:Name="grid1"></Grid>等价于<Grid Name="gr ...

  6. WPF系列(1)WPF和XAML基础

    终于下定决心开始更新WPF一个系列的文章,这里主要是出于两个目的,一是自己对所学的知识有一个系统的总结,二十希望能对其他人有些帮助,如果您觉得我写的不好,欢迎提意见. 那么既然我要开始写WPF,那我们 ...

  7. WPF学习笔记1——XAML之1

    参考文献: http://msdn.microsoft.com/zh-cn/library/ms752059(v=vs.110).aspx <Pro WPF 4.5 in C# > 一.X ...

  8. 什么是XAML?

    XAML类似于XML一样的一种标记语言,主要用来设计UI. 对于XAML的历史,哪些都是废话了,至于Microsoft怎么整出XAML,然后,又怎么让XAML来开发windows 8应用程序,这些,都 ...

  9. Win10系列:UWP界面布局基础1

    随着技术的不断发展,使用者对应用程序的界面体验提出了更高的要求,为了应对越来越复杂的界面设计需求和有效的简化界面开发过程,微软公司在其应用程序的开发技术当中引入一套新的应用程序界面描述语言,这就是XA ...

随机推荐

  1. Windows 8 动手实验系列教程 实验5:进程生命周期管理

    动手实验 实验5:进程生命周期管理 2012年9月 简介 进程生命周期管理对构建Windows应用商店应用的开发者来说是需要理解的最重要的概念之一.不同于传统的Windows应用(它们即使在后台仍然继 ...

  2. 四种方法解决DIV高度自适应问题

    本文和大家重点讨论一下解决DIV高度自适应的方法,这里主要从四个方面来向大家介绍,相信通过本文学习你对DIV高度自适应问题会有更加深刻的认识. DIV高度自适应 关于DIV高度的自适应,一直是个让人头 ...

  3. 在 SSIS package 中使用FTP

    在ssis 包中使用FTP 实际上很简单, 直接拿一个FTP控制流(FTP 任务) ,配置一下FTP 服务器就可以了, 但是当我想在SQL Server Job 中使用这个功能时却报了个错(如下), ...

  4. How to initialize a static const map in c++?

    #include <map> using namespace std; struct A{ static map<int,int> create_map() { map< ...

  5. 积累的VC编程小技巧之工具提示

    1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题    ...

  6. 与众不同 windows phone (18) - Device(设备)之加速度传感器, 数字罗盘传感器

    原文:与众不同 windows phone (18) - Device(设备)之加速度传感器, 数字罗盘传感器 [索引页][源码下载] 与众不同 windows phone (18) - Device ...

  7. Android中ProgressDialog的应用

    下面通过实现点击按钮来显示加载框,2秒后自动消失. 1.首先在layout的xml中添加一个按钮: <Button android:id="@+id/button1" and ...

  8. Missing artifact net.sf.json-lib:json-lib:jar:2.2.3:compile

    json-lib是需要区分jdk版本的,pom.xml中的配置应加上<classifier>标签,如用jdk15: <dependency> <groupId>ne ...

  9. Keywords Search (ac 自己主动机)

    Keywords Search Problem Description In the modern time, Search engine came into the life of everybod ...

  10. 用C语言写解释器(一)——我们的目标

    声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的 ...