天天看點

XAML 概述一

XAML的全稱是Extensible Application Markup Language,就是我們所說的可擴充應用程式标記語言。XAML可以應用到許多不同領域,但主要用于建構使用者界面。

XAML是一種單純的聲明型語言,也就是說,它隻能用于聲明一些UI元素、繪制UI和動畫等;不能在其中加入程式邏輯,從根本上實作了UI和邏輯代碼分離。

XAML是一種由XML派生而來的語言,是以很多XML種的概念在XAML是通用的。

我們通過Visual Studio建立一個WPF應用程式,來介紹一下XAML的命名空間以及一些基本要素:(至于怎麼通過Visual Studio建立WPF Application這裡就不做介紹了)

下面我們來剖析一段最簡單的XAML代碼:

<Window x:Class="WPFDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Width="400" Height="350">
    <Grid Name="Grid1">
        <Grid Name="Grid2"/><!--空标簽-->
    </Grid> 
</Window>      

這段XAML代碼包含3個元素:一個頂層的Window元素,2個Grid元素。在XAML文檔中,所有元素都映射為一個.NET類的對象。

Name 被稱為“Attribute”,通常在類中有一個Name的 “Property”與之對應。Attribute是屬于程式設計語言文法層面的東西;Property屬于面向對象的範疇。是以這2個Name的不同叫法一定不要混淆了。

跟XML文法一樣,可以互相嵌套元素。這段代碼中就是一個Window元素嵌套了一個Grid元素Grid1(或者說Grid元素是Window元素的内容),然後Grid1又嵌套了一個Grid元素。在XAML中隻能有一個頂級元素。盡管可以使用任何頂級元素,但是WPF應用程式中隻能使用如下3種頂級元素:

  · Window元素

  · Page元素(用于可導航的應用程式)

  · Application元素(定義應用程式資源和啟動設定)

 接下來看一下他的命名空間:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      

這跟我們平時.NET中使用的命名空間不一樣。而是看上去像一個網頁位址名稱,但是把他們copy到浏覽器位址欄裡也不會打開網頁。這裡是因為XML命名空間通常用URI。并且不同組織就不會使用相同的命名空間建立不同的基于XML的語言。這裡schemas.microsoft.com就可以看出,由Microsoft所有。還有就是這個URI是XAML解析器的一個硬性編碼,隻要看到這些固定的字元串,就會把一系列的Assembly和其中的.NET命名空間引用進來。

第一個命名空間是WPF的核心名稱空間,它包含了所有的WPF類,繪制UI相關,是表示(Presentation)層上面的東西。可以看到它并不包含字首,是以除非特别指明,所有元素都位于該命名空間下。

第二個帶有x字首的命名空間,對應XAML語言解析處理相關的程式集,是語言層面 上的東西。後面有章節專門講解x命名空間。

最後還剩下一個x:Class="WPFDemo.MainWindow" 沒有介紹了,接下來我們來看看這個Attribute是什麼:

x字首說明,來自于x映射的命名空間。

namespace WPFDemo
{
    /// <summary>
    ///     Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}      

這個檔案隻包含一個簡單的InitializeComponent()方法,而這個方法是在源代碼中不可見的,因為他是編譯自動生成的。我們可以在項目的obj\Debug\檔案夾下找到一個名字與之對應的MainWindow.g.cs 檔案,我們打開看就可以發現該方法的實作。

下面讓我們來做個實驗,來解釋一下x:Class這個Attribute與他對應的MainWindow.cs檔案的關系:

1.首先删除掉x:Class="WPFDemo.MainWindow"這個Attribute

2.同時也注釋掉InitializeComponent(),保證項目能正常編譯通過

3.直接F5發現項目還是能正常運作。這是因為App.xaml中StartupUri這個Attribute指定了這個MainWindow.xaml檔案。隻使用XAML檔案同樣能被編譯器解析。後面的章節我們會講到。

4.然後隻恢複x:Class="WPFDemo.MainWindow"這個Attribute,然後把他改為x:Class="WPFDemo.MainWindow1",編譯之後,項目還是能正常運作。

然後我們調用ildasm指令檢視該項目生成的程式集:

XAML 概述一

會發現有個WPFDemo.MainWindow1的類,正好和我們剛才x:Class="WPFDemo.MainWindow1"的Attribute設定的值一緻。由此,我們可以看出,x:Class這個Attribute的作用就是當XAML解析器将該特性解析成C#後的類名。

通過一個簡單的WPF應用程式我們整體上了解了下XAML,接下來的章節我們将系統的了解一下XAML的文法,當然還包括講解x命名空間,還有就是加載和編譯XAML。

轉載于:https://www.cnblogs.com/Mind-Hacker/p/3470939.html

ui c#