XAML:知识记录 1、x:Class指示xaml编译器将xaml编译的结果 和 当前哪个C#类合并在一起。Windowx:ClassWpfApplication1.MainWindow/Window2、用户界面的树形结构、XAML中为对象属性赋值的3种方法知识点核心要点示例树形结构WPF以根元素如Window起始向下嵌套布局容器与控件构成逻辑树与可视树是路由事件与属性继承的底层基础。WindowGridStackPanelTextBlock Text姓名/TextBox Width150/Button Content提交//StackPanel/Grid/WindowAttribute Value直接在标签中写属性名字符串值XAML编译器通过内置类型转换器TypeConverter将字符串转为目标类型。Button Content点击 BackgroundBlue Width100 Height40/Rectangle FillRed Width200 Height50/属性标签当属性值无法用字符串表达需嵌套对象时使用对象.属性名作为子标签在其中定义复杂内容。ButtonButton.ContentStackPanel OrientationHorizontalImage Sourceicon.png Width20/TextBlock Text下载文件//StackPanel/Button.Content/Button标签扩展使用{}花括号包裹的特殊语法用于数据绑定Binding、静态/动态资源引用StaticResource/DynamicResource等高级场景。!-- 数据绑定 --TextBox Text{Binding ElementNameslider1, PathValue}/!-- 静态资源引用 --TextBlock Text{StaticResource myString}/3、知识点核心要点示例事件处理器与代码后置WPF支持在XAML中为对象的事件指定事件处理器。方法是用事件处理器的函数名为对象的事件Attribute赋值。将逻辑代码与UI代码分离、隐藏在UI代码后面的形式称为代码后置Code-Behind-。.NET的partial类机制使得XAML解析生成的代码能与x:Class指定的类合并。VS中可在XAML里右键点击事件名称选择“Navigate to Event Handler”快速跳转到后置代码。需要注意一切实现程序逻辑的代码都应放在后置的C#文件中-。!-- XAML中的事件订阅 --Button x:NamebtnOkContent点击我ClickButton_Click/// 后置C#代码中的事件处理器private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show(按钮被点击了);}// 也可以在C#中通过代码订阅事件this.btnOk.Click BtnOk_Click;-2导入程序集和引用其中的名称空间在XAML中使用xmlnsXML命名空间声明来引用程序集及其中的名称空间-。语法格式为xmlns:映射名clr-namespace:类库中名称空间的名字;assembly类库文件名。xmlns冒号后的映射名是可选的引号中的字符串指定要引用的类库及名称空间。与C#中的using类似但XAML需要为被引用的名称空间添加一个映射名来代表它。引用外部程序集时需要先在项目中添加对该程序集的引用。!-- 引用当前程序集中的自定义命名空间 --xmlns:localclr-namespace:MyWpfApp!-- 引用外部程序集中的命名空间 --xmlns:myclr-namespace:MyNamespace;assemblyClassLibrary1-9!-- 在XAML中使用引用的类型 --local:MyUserControl /XAML的注释XAML的注释语法继承自XML-1使用!--和--包裹注释内容。注意事项①注释只能出现在标签的内容区域即开始标签和结束标签之间不能出现在标签的Attribute位置-1②注释不能嵌套--1③避免在数据绑定表达式中使用注释-。另外XAML中还有一个特殊的x:Code标签可以把本应放在后置代码中的C#代码搬到XAML文件中来但其内容必须使用XML的CDATA转义标签。!-- 这是XAML中的单行注释 --!--这是XAML中的多行注释--!-- 错误不能在标签的Attribute位置注释 --!-- 错误注释不能嵌套 --!-- 使用x:Code在XAML中嵌入C#代码不推荐 --x:Code![CDATA[private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show(Hello);}]]/x:Code-94、知识点核心要点示例x名称空间的由来和作用每个XAML程序的开头都有xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml将XML名称空间映射到前缀x-1。x就是XAML的首字母-1-。x名称空间里的成员是专门写给XAML编译器看的用来引导XAML编译器把XAML代码编译成CLR代码-2-——它是程序员与XAML编译器沟通的工具-6。Window x:ClassWpfApp1.Window1xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml...说明第一行xmlns是WPF核心名称空间无前缀作为默认第二行xmlns:x将XAML语言相关的名称空间映射到前缀x-17。x名称空间里都有些什么x名称空间中的成员分为三类-1-5①Attribute如x:Class、x:ClassModifier、x:Name、x:FieldModifier、x:Key等-1②标记扩展Markup Extension如x:Array、x:Null、x:Static、x:Type等-1③XAML指令元素如x:Code、x:XData-1。Attribute与Property的区别Attribute是语言层面的、给编译器看的Property是对象层面的、给编程逻辑用的-1-6。!-- Attribute形式 --Button x:NamebtnOk Content确定/!-- 标记扩展形式用{}包裹 --TextBlock Text{x:Static local:MyClass.StaticText}/!-- XAML指令元素形式 --x:Array Typesys:Stringsys:StringItem1/sys:String/x:Arrayx:Class告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并-6-13。使用要求①只能用于根节点如Window、UserControl-6-17②根节点的类型与x:Class值所指示的类型保持一致-6-19③目标类在声明时必须使用partial关键字-6-13。正是由于partial机制XAML解析生成的类与C#文件里定义的类合二为一-13。!-- XAML中 --Window x:ClassMyApp.MainWindow...//后台C#代码中Window1.xaml.csnamespace MyApp{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}}}说明XAML编译器生成的类与C#中的partial类合并为一个完整的类-13。x:ClassModifier这个属性同样不常用。必须和x:Class一起使用。核心作用用来修改由x:Class指定的、整个窗口或控件类的访问级别。Window x:ClassMyApp.MainWindowx:ClassModifierinternal...说明生成的MainWindow类将被标记为internal访问级别而不是默认的public--5。x:Name使用频率极高。核心作用为XAML中声明的UI元素创建一个可以在C#后台代码中直接引用的变量名。!-- 使用x:Name为控件命名 --Button x:NamebtnSubmit Content提交/TextBox x:NametxtUserName Width200/// 在C#后台代码中直接引用private void BtnSubmit_Click(object sender, RoutedEventArgs e){string name txtUserName.Text;MessageBox.Show(你好 name);}说明通过x:Name声明的变量可以在C#代码中直接访问对应的控件实例-17。x:FieldModifier这个属性不常用。它是在x:Name的基础上。核心作用用来修改由x:Name生成的引用变量的访问级别。!-- 将按钮的引用变量设为public--Button x:NamebtnOkx:FieldModifierpublicContent确定/!-- 将文本框的引用变量设为private--TextBox x:NametxtInputx:FieldModifierprivateWidth200/说明x:FieldModifierpublic使得btnOk这个引用变量在其他程序集中也能被访问-。1