《深入淺出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注釋不能嵌套


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM