zoukankan      html  css  js  c++  java
  • 《深入浅出WPF》学习总结之XAML标签语言一

    一、XMAL概览

      1、XAML在桌面开发及富媒体网络程序的开发中扮演了HTML+CSS+JS的角色。
      2、XAML可以将UI和逻辑代码分离,降低耦合度。
      3、XAML是一种单纯的申明形语言
      4、XAML是由XML派生而来的语言,所以很多XML中的概念在XAML中是通用的
      5、XAML是一种“声明”式语言,当你看见一个标签,就意味着声明了一个对象,对象之间的层级关系是并列、要么包含。全都体现在标签的关系上

    二、剖析最简单的XAML

     1 <Window x:Class="WpfApp4.MainWindow"
     2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     6 xmlns:local="clr-namespace:WpfApp4"
     7 mc:Ignorable="d"
     8 Title="Main Window" Height="450" Width="800">
     9 <Grid>
    10 </Grid>
    11 </Window>

    其中,Title、Height和Width是与Window对象的Property相对应的。
    第3行的xmlns表示引用引用命名空间。冒号表示映射命名空间。在后面使用的方式为 映射名:类名 如果没有写前缀,那就意味着所有来自于这个空间的标签前都不用加前缀,就成为默认名称,默认名称自能有一个,其他就必须加前缀
    第2行像地址的命名空间是XAML解析器的一个硬性编码,要见到这些固定字符串,就会把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。

    三、XAML中为对象属性赋值的语法

    XAML是一种声明性语言,XAML编译器会为每个标签创建一个与之对应的对象,对象创建出来之后要对他的属性进行必要的初始化之后才有意义。因为XAML语言不能编写程序的运行逻辑,所以一份XAML文档中除了使用标签声明对象就是初始化对象的属性了
    XAML中为对象属性赋值共有两种语法
      1、使用字符串进行简单赋值
      2、使用属性元素(Property Element)进行复杂赋值

    1 <!--使用字符串进行简单赋值-->
    2 <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
    3 <Rectangle Width="200" Height="100" Fill="Blue"></Rectangle>
    4 </Grid>
     1 <!--使用属性元素(Property Element)进行复杂赋值-->
     2 <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
     3 <Rectangle Width="200" Height="100">
     4 <Rectangle.Fill>
     5 <SolidColorBrush Color="Blue"/>
     6 </Rectangle.Fill>
     7 </Rectangle>
     8 </Grid>
     9 
    10 <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
    11 <Rectangle Width="200" Height="100">
    12 <Rectangle.Fill>
    13 <LinearGradientBrush>
    14 <LinearGradientBrush.StartPoint>
    15 <Point X="0" Y="0"/>
    16 </LinearGradientBrush.StartPoint>
    17 <LinearGradientBrush.EndPoint>
    18 <Point X="1" Y="1"/>
    19 </LinearGradientBrush.EndPoint>
    20 <LinearGradientBrush.GradientStops>
    21 <GradientStopCollection>
    22 <GradientStop Offset="0.2" Color="LightBlue"/>
    23 <GradientStop Offset="0.7" Color="Blue"/>
    24 <GradientStop Offset="1.0" Color="DarkBlue"/>
    25 </GradientStopCollection>
    26 </LinearGradientBrush.GradientStops>
    27 </LinearGradientBrush>
    28 </Rectangle.Fill>
    29 </Rectangle>
    30 </Grid>

    简化XAML属性赋值的技巧
      1、能使用Attribute=Value形式的赋值就不使用属性元素
      2、充分利用默认值,去除冗余
      3、充分利用XAML的简写方式

    四、标记扩展

    所谓标记扩展,实际上是一种特殊的Attribute=Value语法,其特殊的地方在于Value字符串是由一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做出解析,生成相对应的对象。

    1 <StackPanel>
    2 <TextBox Margin="5" Text="{Binding ElementName=slider1, Path=Value, Mode=OneWay}"></TextBox>
    3 <Slider Name="slider1" Margin="5"></Slider>
    4 </StackPanel>

    其中,Text="{Binding ElementName=slider1, Path=Value, Mode=OneWay}"就是标记扩展了。我们分析一下这句代码
      1、当编译器看到这句代码时就会把花括号里的内容解析成对应的对象
      2、对象的数据类型就是紧邻左花括号的字符串
      3、对象的属性由一串以逗号连接的子字符串负责初始化(注意,属性值不再加引号。属性之间通过逗号隔开。类似于C#对象的初始化器)
    尽管标记扩展的语法简介方便,但并不是所有对象都能用标记扩展的语法来书写,只有MarkupExtension类的派生类(直接或间接均可)才能使用标记扩展来创建对象。
    使用标记扩展需要注意的几点:
      1、标记扩展是可以嵌套的,例如Text="{Binding Source = {StaticResource myDataSource}, Path = PersonName}"是正确的
      2、标记扩展具有一些简写语法,例如"{Binding Value ...}"与"{Binding Path=Value...}"是等价的,"{StaticResource myString...}"与"{StaticResource ResourceKey=myString}"是等价的。两种写法中,前者成为固定位置参数(Positional Parameter)后者成为具名参数(Named Parameters)。固定位置参数实际上就是标记扩展类构造器的参数,其位置由构造器参数列表决定。
      3、标记扩展类的类名均以单词Extension为后缀,在XAML中使用它们的时候Extension后缀可以省略不写,比如写Text="{x:Static...}"与Text="{x:StaticExtension...}"是等价的。

    五、事件处理器与代码后置类

    事件处理器
    当一个XAML标签对应着一个对象时,这个标签的一部分Attribute会对应这个对象的Property。除了这部分对应着对象Property的Attribute外,还有一部分Attribute会对应着对象的事件(Event)。<Button>标签有一个名为Click的Attribute,它对应的就是Button类的Click事件

    <ClassName EventName = "EventHandlerName"/>

    如果把<Button x:Name = "btnTest" Click="btnTest_Click"/>这句话转化为C# WinForm代码,基本上为

    var btnTest = new Button();
    btnTest.Click+=btnTest_Click;

    代码后置(Code-Behind)
    C#编写的代码用于处理程序的逻辑,需要与UI的XAML代码分开。由于c#支持partial类,XAML标签又可以使用x:Class特征来指定将由XAML代码解析生成的类与哪个类合并,因此我们完全可以把用于实现的程序逻辑的C#代码放在一个文件里,把用于描述程序UI的XAML代码放在另一个文件里。并且让事件性Attribute充当XAML与C#之间沟通的纽带。从后台控制前面的UI,这种将逻辑代码与UI代码分离,隐藏在UI代码后面的形式叫做代码后置

    1 <Grid>
    2 <Button x:Name="btnTest" Content="ClickMe" Width="80" Height="30" Click="btnTest_Click"></Button>
    3 </Grid>
    4 
    5 private void btnTest_Click(object sender, RoutedEventArgs e)
    6 {
    7   MessageBox.Show((sender as Button).Content.ToString());
    8 }

    注意:
    不只是事件处理器,一切用于实现程序逻辑处理的代码都要放在后置的C#文件中
    默认情况下,VS为每个XAML文件生成的后置代码文件名为"XAML文件全名.cs",比如XAML文件名为MyWindow.xaml,那么他的后置代码名为MyWindow.xaml.cs。这样做是为了方便管理文件,但并不是必要的,只要XAML解析器能找到x:Class所指定的类,无论你的文件叫什么名字都可以。
    XAML的后置代码一样可以写到XAML文件中,需要使用x:Code标签。x:Code的内容一定要使用XML语言的<![CDATA[...]]>转义标签。但不推荐,这样会增加前后端耦合度

     1 <Grid>
     2 <Button x:Name="btnTest" Content="ClickMe" Width="80" Height="30" Click="btnTest_Click"></Button>
     3 </Grid>
     4 
     5 <x:Code>
     6 <![CDATA[
     7 private void btnTest_Click(object sender, RoutedEventArgs e)
     8 {
     9 MessageBox.Show((sender as Button).Content.ToString());
    10 }
    11 ]]>
    12 </x:Code>


    六、导入程序集和引用其中的命名空间

    想在自己的程序里引用类库,主要分三个步骤
      1、编写类库项目并编译得到.dll文件或者获得别人编译的.dll文件
      2、将类库项目或者.dll引进自己的项目
      3、在C#和XAML中引用类库中的名称空间
    xmlns:映射名="clr-namespace:类库中名称空间的名字,assembly=类库文件名"

    XAML中引用名称空间的映射名类似于C#中的

    using Cnn = Connection;

    七、XAML的注释

    XAML的注释语法亦继承自XML,语法:
    <!-- 需要注释的内容 -->

    注意:
      1、XAML注释只能出现在标签的内容区域,即只能出现在开始标签和结束标签之间
      2、XAML注释不能用于注释标签的Attribute
      3、XAML注释不能嵌套

  • 相关阅读:
    改造二叉树
    汽车加油行驶问题
    [SHOI2012]回家的路
    子串
    P3558 [POI2013]BAJ-Bytecomputer
    HDU
    UVALive
    ZOJ
    HDU
    牛客小白月赛2 题解
  • 原文地址:https://www.cnblogs.com/insipid/p/11894471.html
Copyright © 2011-2022 走看看