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 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...
随机推荐
- Shell Sort(草稿)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shel ...
- C#正则表达式编程(四):正则表达式
正则表达式提供了功能强大.灵活而又高效的方法来处理文本.正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式:提取.编辑.替换或删除文本子字符串:或将提取的字符串添加到集合以生成 ...
- Nginx模块学习之————accesskey权限模块使用(Nginx防盗链详细解说),防止别人下载文件和图片
nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链 1.具体安装教程:http://www.cnblogs.com/tinywan/p/5983694. ...
- HDU5829 NTT
以下这份代码并没有过.但感觉没有问题.不是蜜汁WA就是蜜汁T. #include <cstdio> #include <iostream> #include <cstri ...
- JS事件中的对象
在触发任何事件时都会产生一个对象.如:DOM事件,window事件等,都会产生一个对象,该对象就是当前元素的事件对象. DOM事件对象 <body> <input type=&quo ...
- Object Pascal 语言基础
Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...
- iOS开发之Xcode 6 国际化
Xcode6 国际化 (1) 新建一个Single View app模版项目,命名为LocalizationTest 1.建立strings文件,命名为Localization.strings 2.点 ...
- 使用js加载器动态加载外部Javascript文件
原文:http://www.cnblogs.com/xdp-gacl/p/3927417.html 今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js var ...
- MyBatis——Mybatis缓存
原文:http://www.cnblogs.com/xdp-gacl/p/4270403.html MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架 ...
- (Clob的写入和读取-java)更新数据库报错:SQL Error: 1461, SQLState: 72000 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
原 因:某一个字段本为varchar2(1024),但是实际要插入的值超过varchar2允许的最大长度4000时,oracle自动将该字段值转化为Long类型,然后提示插入操作失败. 解决办法: 1 ...