1.XAML

Extension Application Marked Language,是WPF技术中专门用来设计UI的语言。XAML是从XML派生出来的,是一种声明式语言,当你看到一个标签,就是声明了一个对象

  1. <Window x:Class="WPF.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525">
  5. <Grid>
  6.  
  7. </Grid>
  8. </Window>

XAML语言有一个功能就是可以在XML标签上使用xmlns特征来定义命名空间,xmlns也是xml-namespace的缩写。

xmlns特征语法格式:xmlns[:可选的映射前缀]="命名空间"。如果没有写可选映射前缀意味着所有来自这个命名空间的标签前都不用加标签,而这个没有映射前缀的命名空间称为"默认名称空间"(默认名称空间只能一个,而且应该选择其元素被最频繁使用的命名空间来充当默认名称空间)。

x:Class="WPF.MainWindow"这个Attribute的作用是当XAML解析器把所包含它的标签解析成C#类时,这个类的类名是什么

2.xaml引用外来程序集

在C#中想引用System.Windows.Controls的Button类,需通过添加引用方式把包含System.Windows.Controls的程序集PresentationFrameWork添加到项目中,然后在C#代码顶部写上一句:System.Windows.Controls.XAML也是一样的,先添加对程序集的引用,再在根元素的起始标签写上一句:xmls:c="clrs-namespace:System.Windows.Controls;Assembly=PresentationFrameWork".所以使用button应该为<c:button></c:button>

二.XAML语法

XAML使用标签定义UI元素,每个标签对应NET Framework类库中的一个控件类,通过设置标签的Attribute可以对对应控件类的Property赋值.xaml使用树形逻辑结构来表示UI,同一个看上去一样的UI布局,XAML代码不是唯一的

1.xaml对象属性赋值

两种方式:

  • 使用字符串赋值,即标签属性Attribute为对象属性赋值
  • 使用属性标签赋值。xaml为属性赋值,大多数情况都是每个属性值都是为属性生成一个对象

(1.)使用标签属性Attribute为对象属性赋值

<Rectangle Width="100" Height="50" Fill="Blue"></Rectangle>

通过Attribute=Value赋值,由于XAML语言限制,value只能是字符串。因此有时出现2中情况:A.一个类使用XAML声明并允许它的Attribute与Property互相映射,该类必须为这些Property准备转换机制;B.Value字符串格式的限制,此时可以用属性标签

A.一个类使用XAML声明并允许它的Attribute与Property互相映射,该类必须为这些Property准备转换机制。

  1. exp:
  2. 有个类
  3. public class Human
  4. {
  5. public string Name { get; set; }
  6. public Human Child { get; set; }
  7. }
  8. xaml文件:
  9. <Window x:Class="WpfApplication1.MainWindow"
  10. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  11. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  12. xmlns:sys="clr-namespace:System;assembly=mscorlib"
  13. xmlns:local="clr-namespace:WpfApplication1"
  14. Title="MainWindow" Height="" Width="">
  15.  
  16. <Window.Resources>
  17. <local:Human x:Key="Human" Child="ABC"></local:Human>
  18. </Window.Resources>
  19. <Button x:Name="button" Click="button_Click" Width="" Height="" Background="Blue"></Button>
  20.  
  21. </Window>
  22. 按钮事件:
  23. private void button_Click(object sender, RoutedEventArgs e)
  24. {
  25. Human h = (Human)this.FindResource("Human");
  26. MessageBox.Show(h.Child.Name);
  27. }

编译成功,但运行失败。Human的Child是Human实例,XAML代码中ABC是字符串,xaml编译时不知道如何将字符串转换为Human对象。解决办法使用TypeConverter

和TypeConverterAttribute:

  1. //首先重写一个类派生于TypeConverter
  2. public class StringToHumanTypeConverter : TypeConverter
  3. {
  4. public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
  5. {
  6. if (value is string)
  7. {
  8. Human h = new Human();
  9. h.Name = value as string;
  10. return h;
  11. }
  12. return base.ConvertFrom(context, culture, value);
  13. }
  14. }
  15. //然后用TypeConverterAttribute将这个类与Human进行标明
  16. [TypeConverterAttribute(typeof(StringToHumanTypeConverter))]
  17. public class Human
  18. {
  19. public string Name { get; set; }
  20. public Human Child { get; set; }
  21. }

对于普通的属性赋值字符串,XAML处理器会根据属性的类型决定是否需要执行对字符串的转化。如果属性的类型不是字符串,那么XAML处理器会调用相应的转化逻辑。如对于枚举类型的属性,XAML处理器将通过Enum的Parse方法得到相应类型的数值。而对于自定义类型,XAML会根据该自定义类型声明或属性声明上所标明的TypeConverter将字符串转换为该自定义类型。

(2.)属性标签

<className>
  <className.Property>
     <!--以对象形式为属性赋值-->
  </className.Property>
</className>

  1. exp:
  1. <Rectangle x:Name="rectangle" Width="" Height="">
  2. <Rectangle.Fill>
  3. <SolidColorBrush Color="Blue"></SolidColorBrush>
  4. </Rectangle.Fill>
  5. </Rectangle>

2.标记拓展

WPF允许一个对象的属性值依赖于其他对象的属性,此时这个属性赋值需要用到标记拓展

exp:TextBox的内容依赖于Slider的Value值

  1. <Window x:Class="WpfApplication1.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:sys="clr-namespace:System;assembly=mscorlib"
  5. xmlns:local="clr-namespace:WpfApplication1"
  6. Title="MainWindow" Height="" Width="">
  7. <StackPanel Background="LightSlateGray">
  8. <TextBox Text="{Binding ElementName=silder,Path=Value,Mode=OneWay}" Margin=""></TextBox>
  9. <Slider x:Name="silder" Margin=""></Slider>
  10. </StackPanel>
  11. </Window>

其中Text="{Binding ElementName=silder,Path=Value,Mode=OneWay}"即标记拓展,编译器解析到这句代码是将此解析成Binding实例对象。并不是所有对象都能使用

标记拓展来书写,只有MarkupExtension的派生类(直接或间接,都以Extension为后缀)才可以。MarkupExstension的直接派生类:

System.Object
  System.Windows.Markup.MarkupExtension
    System.Activities.Presentation.CachedResourceDictionaryExtension
    System.Activities.XamlIntegration.DynamicUpdateMapExtension
    System.Activities.XamlIntegration.PropertyReferenceExtension<T>
    System.ServiceModel.EndpointIdentityExtension
    System.ServiceModel.XamlIntegration.SpnEndpointIdentityExtension
    System.ServiceModel.XamlIntegration.UpnEndpointIdentityExtension
    System.ServiceModel.XamlIntegration.XPathMessageContextMarkupExtension
    System.Windows.ColorConvertedBitmapExtension
    System.Windows.Data.BindingBase
    System.Windows.Data.RelativeSource
    System.Windows.DynamicResourceExtension
    System.Windows.Markup.ArrayExtension
    System.Windows.Markup.NullExtension
    System.Windows.Markup.Reference
    System.Windows.Markup.StaticExtension
    System.Windows.Markup.TypeExtension
    System.Windows.ResourceKey
    System.Windows.StaticResourceExtension
    System.Windows.TemplateBindingExtension
    System.Windows.ThemeDictionaryExtension

3.导入程序集与引用其中的名称空间

xmlns:映射名="clr-namespace:名称空间;assembly=程序集名"

exp:xmlns:sys="clr-namespace:System;assembly=mscorlib"

4.注释:<!--注释掉的内容-->

XAML-1的更多相关文章

  1. x:bind不支持样式文件 或 此Xaml文件必须又代码隐藏类才能使用{x:Bind} 解决办法

    这两天学习UWP开发,发现一个很有趣的问题,就是我题目中的描述的. 我习惯了在ResourceDictionary中写样式文件,但是发现用x:Bind时会有问题 如果是写在Style里,则提示 “x: ...

  2. Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容

    我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...

  3. Windows10-UWP中设备序列显示不同XAML的三种方式[3]

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  4. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  5. 04.移动先行之谁主沉浮----XAML的探索

    如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 移动先行之谁主沉浮? 带着你的Net飞奔吧! 链接======>(点) XMAL引入 XAML 类似于 HTML,是一种 ...

  6. 06.移动先行之谁主沉浮----我的代码我来写(Xaml的优势)

    如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 前面几节课,我们都是在前台创建对象,进行一些设置,那么我们为什么不用传统的方法来编程呢? 我们今天来试试你就明了了~~ 打开M ...

  7. 30分钟学会XAML

    1.狂妄的WPF 相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API.例如:WinForm(带控件表单).GDI+(2D图形).DirectX API(3D图形)以及流媒体和 ...

  8. 关于 WP 开发中.xaml 与.xaml.cs 的关系

    今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...

  9. WPF入门:XAML

    XAML是WPF技术中专门用于设计UI的语言 XAML优点最大的优点是将UI与逻辑代码剥离 创建第一个WPF应用程序 VS默认生成的WPF项目解决方案 Properties:里面主要包含了程序用到的一 ...

  10. [No0000AE]在 Visual Studio 中调试 XAML 设计时异常

    在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...

随机推荐

  1. Scrum Meeting---One(2015-10-20)

    一.scrum meeting 在上周六我们团队进行了一次会议,讨论了我们团队的项目以及项目分工.首先是确立我们的项目,在团队的激烈讨论下我们决定做一个校园相关的APP.然后对于这个项目我们大致进行了 ...

  2. Redis脚本插件之————执行Lua脚本示例

    Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在red ...

  3. HDU5829 NTT

    以下这份代码并没有过.但感觉没有问题.不是蜜汁WA就是蜜汁T. #include <cstdio> #include <iostream> #include <cstri ...

  4. Java中List Set Map 是否有序等总结

    1.Collection List Set Map 区别记忆 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文 ...

  5. nyoj 28 大数阶乘

    题目链接:nyoj 28 就是个简单的高精度,只是一开始我打表超内存了,然后用了各种技巧硬是把内存缩到了题目要求以下(5w+kb),感觉挺爽的,代码如下: #include<cstdio> ...

  6. 使用kaptcha生成验证码

    原文:http://www.cnblogs.com/xdp-gacl/p/4221848.html kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜色.显示的字符等等 ...

  7. 转:Eric Lippert:阅读代码真的很难

    转自:http://blog.jobbole.com/438/ 相关文章 微软资深软件工程师:阅读代码真的很难(第2篇) 阅读优秀代码是提高开发人员修为的一种捷径 学会阅读源代码 如何阅读大型代码库? ...

  8. LinuxShell脚本攻略--第二章 命令之乐

    用 cat 进行拼接 文件查找与文件列表玩转 xargs 用 tr 进行转换排序临时文件命名与随机数分割文件和数据根据扩展名切分文件名mv 批量重命名文件交互输入自动化 cat: echo 'Text ...

  9. 项目解析- JspLibrary - part1

    http://rosspc:8080/JspLibrary/ 1. logon界面解析: JS 验证用户名.密码为空 <form name="form1" method=&q ...

  10. HTML5游戏实战(4): 20行代码实现FlappyBird

    这个系列很久没有更新了.几个月前有位读者调侃说,能不能一行代码做一个游戏呢.呵呵,接下来一段时间,我天天都在想这个问题,怎么能让GameBuilder+CanTK进一步简化游戏的开发呢.经过几个月的努 ...