XAML-1
1.XAML
Extension Application Marked Language,是WPF技术中专门用来设计UI的语言。XAML是从XML派生出来的,是一种声明式语言,当你看到一个标签,就是声明了一个对象
<Window x:Class="WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid> </Grid>
</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准备转换机制。
exp:
有个类
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
}
xaml文件:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="" Width=""> <Window.Resources>
<local:Human x:Key="Human" Child="ABC"></local:Human>
</Window.Resources>
<Button x:Name="button" Click="button_Click" Width="" Height="" Background="Blue"></Button> </Window>
按钮事件:
private void button_Click(object sender, RoutedEventArgs e)
{
Human h = (Human)this.FindResource("Human");
MessageBox.Show(h.Child.Name);
}
编译成功,但运行失败。Human的Child是Human实例,XAML代码中ABC是字符串,xaml编译时不知道如何将字符串转换为Human对象。解决办法使用TypeConverter
和TypeConverterAttribute:
//首先重写一个类派生于TypeConverter
public class StringToHumanTypeConverter : TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
Human h = new Human();
h.Name = value as string;
return h;
}
return base.ConvertFrom(context, culture, value);
}
}
//然后用TypeConverterAttribute将这个类与Human进行标明
[TypeConverterAttribute(typeof(StringToHumanTypeConverter))]
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
}
对于普通的属性赋值字符串,XAML处理器会根据属性的类型决定是否需要执行对字符串的转化。如果属性的类型不是字符串,那么XAML处理器会调用相应的转化逻辑。如对于枚举类型的属性,XAML处理器将通过Enum的Parse方法得到相应类型的数值。而对于自定义类型,XAML会根据该自定义类型声明或属性声明上所标明的TypeConverter将字符串转换为该自定义类型。
(2.)属性标签
<className>
<className.Property>
<!--以对象形式为属性赋值-->
</className.Property>
</className>
exp:
<Rectangle x:Name="rectangle" Width="" Height="">
<Rectangle.Fill>
<SolidColorBrush Color="Blue"></SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
2.标记拓展
WPF允许一个对象的属性值依赖于其他对象的属性,此时这个属性赋值需要用到标记拓展
exp:TextBox的内容依赖于Slider的Value值
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="" Width="">
<StackPanel Background="LightSlateGray">
<TextBox Text="{Binding ElementName=silder,Path=Value,Mode=OneWay}" Margin=""></TextBox>
<Slider x:Name="silder" Margin=""></Slider>
</StackPanel>
</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的更多相关文章
- x:bind不支持样式文件 或 此Xaml文件必须又代码隐藏类才能使用{x:Bind} 解决办法
这两天学习UWP开发,发现一个很有趣的问题,就是我题目中的描述的. 我习惯了在ResourceDictionary中写样式文件,但是发现用x:Bind时会有问题 如果是写在Style里,则提示 “x: ...
- Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容
我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...
- Windows10-UWP中设备序列显示不同XAML的三种方式[3]
阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 04.移动先行之谁主沉浮----XAML的探索
如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 移动先行之谁主沉浮? 带着你的Net飞奔吧! 链接======>(点) XMAL引入 XAML 类似于 HTML,是一种 ...
- 06.移动先行之谁主沉浮----我的代码我来写(Xaml的优势)
如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 前面几节课,我们都是在前台创建对象,进行一些设置,那么我们为什么不用传统的方法来编程呢? 我们今天来试试你就明了了~~ 打开M ...
- 30分钟学会XAML
1.狂妄的WPF 相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API.例如:WinForm(带控件表单).GDI+(2D图形).DirectX API(3D图形)以及流媒体和 ...
- 关于 WP 开发中.xaml 与.xaml.cs 的关系
今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...
- WPF入门:XAML
XAML是WPF技术中专门用于设计UI的语言 XAML优点最大的优点是将UI与逻辑代码剥离 创建第一个WPF应用程序 VS默认生成的WPF项目解决方案 Properties:里面主要包含了程序用到的一 ...
- [No0000AE]在 Visual Studio 中调试 XAML 设计时异常
在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...
随机推荐
- 关于ListView嵌套GridView中的onItemClickListener失效问题
一开始在ListView中设置了onItemClickListener,在里面Log输出Item列表的位置,完全没有反应, 网上大部分说的什么把子组件屏蔽掉(而且好多都是转载的一样的), 可是我希望的 ...
- Nginx入门笔记之————配置文件结构
在nginx.conf的注释符号位# nginx文件的结构,这个对刚入门的同学,可以多看两眼. 默认的config: #user nobody; worker_processes ; #error_l ...
- poj1244Slots of Fun
链接 几何的简单题,建立坐标,判断相等以及不共线 #include <iostream> #include<cstdio> #include<cstring> #i ...
- 关于我们DOM的知识点
DOM的概念及子节点类型 前言 DOM的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容).浏览器会根据DOM模型,将HTML文档解析 ...
- 共享内存 最快IPC 的原因
参考 http://www.360doc.com/content/13/0817/11/7377734_307777806.shtml 我的理解,这里指的是用户进程的用户态空间和内核空间,也就是那个3 ...
- nyoj 28 大数阶乘
题目链接:nyoj 28 就是个简单的高精度,只是一开始我打表超内存了,然后用了各种技巧硬是把内存缩到了题目要求以下(5w+kb),感觉挺爽的,代码如下: #include<cstdio> ...
- 【服务器环境搭建-Centos】系统分区 待续
df命令查看,显示/dev/vda,而不是sda或hda ,为什么? 虚拟机为了提升性能,一般使用virtio作为磁盘驱动,在虚拟机里面磁盘会显示成vda而不是传统的sda,有什么办法可以让他显示成s ...
- hdu_3555 bomb
数位动态规划 数位动态规划是求解一个大区间[L, R]中间满足条件Q的所有数字的个数(或者和,或其他)的一种方法.它通过分析每一位上的数字,一般用 dp[len][digit][...] 来表 ...
- ManyToMany关联方式----
http://blog.csdn.net/sinat_18882775/article/details/51171427 好的博客 系列文章总结
- [转]Android ORM系列之GreenDao最佳实践
GreenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储.更新.删除和查 ...