WPF之路-從XAML入手

來自專欄編程改變世界

WPF新建好一個窗口後,會生成如下的XAML語句

<Window x:Class="WPF_Code.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>

同XML類似,XAML中最基本的語法元素就是標籤、屬性、內容

標籤是通常是以<>開始,以結束的,一個標籤的聲明通常表示一個對象。如<Window></Window>、<Grid></Grid>分別定義了一個窗體對象及一個Grid對象,標籤定義有兩種常用寫法:

  • 非自閉合簽:<Window></Window>、<Grid></Grid>
  • 自閉合標籤:< Window />、 <Grid/>這種自閉合標籤用於無內容情況下,可以讓代碼看上去更簡潔,當然,正常情況下Window及Grid都是有內容的

屬性通常以鍵值對形式出現,如<Window><Window/>標籤中的Title="MainWindow" Height="350" Width="525",等號左邊表示Window標籤的屬性,等號右邊表示該屬性的值

一組標籤對之間夾雜的文本或其他標籤都稱為這個標籤之間的內容。此處Window標籤的內容就是一個<Grid><Grid/>標籤

x:Class="WpfExam.MainWindow":這裡指定了我們XAML窗體界面對應的C#類,是WpfExam命名空間下的MainWindow這個分部類。

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation":表示引用wpf界面表現相關的命名空間,類似於我們C#類中的using

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml":表示引用xaml相關的命名空間。

這個xmlns:x中的x只是一個默認的標識符,如果我們將他改成y的話,編譯我們的程序,將會報錯找不到屬性Class,此時我們就需要將x:Class="WpfExam.MainWindow"修改為y:Class="WpfExam.MainWindow"

同樣,如果我們將xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"也增加一個標示符號的話,假如我們改成xmlns:a="http://schemas.microsoft.com/winfx/2006/xaml/presentation",那麼將會提醒你找不到類型

Window、Grid,你需要標籤<Window>、<Grid>替換為<a:Window>、<a:Grid>

示例,為Grid設置漸變色

<Window x:Class="WPF_Code.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.Background> <LinearGradientBrush> <GradientStop Color="#FFE27232" Offset="0"/> <GradientStop Color="White" Offset="1"/> <GradientStop Color="#FF6EBF61" Offset="2"/> </LinearGradientBrush> </Grid.Background> </Grid></Window>

元素的屬性也可以通過標籤來表示,如上所示的<Grid.Background>就是使用了Grid的背景屬性,然後通過同樣的方式,設置畫筆的顏色,偏移量等待,完成漸變色

還可以通過打開屬性面板》畫筆來設置漸變色

既然說一個標籤的聲明就是一個類對象,那按照道理可以通過代碼來創建類實現元素的創建

下面創建一個空的項目,然後添加兩個類,分別命名為MyWindow.cs和Program.cs,前者用來創建一個包含按鈕的窗體,後者用來啟動這個窗體

MyWindow.cs

//需要引用以下三個命名空間using System.Windows;using System.Windows.Controls;using System.Windows.Markup;namespace WPF_Code{ //當前類要繼承處Window類 class MyWindow : Window { //一個未實例化的按鈕對象 private Button btn; //當前窗體的構造函數 public MyWindow() { InitializeComponent(); } //用於初始化窗體 private void InitializeComponent() { //設置窗體大小 this.Width = 280; this.Height =200; this.Left = this.Top = 100; this.Title = "MyWindow"; //創建一個容器,用來接收Button DockPanel dock_panel = new DockPanel(); //創建按鈕對象 btn = new Button(); btn.Content = "Plese click me."; btn.Margin = new Thickness(30); //為按鈕綁定事件 btn.Click += btn_Click; //提供分析允許混合子元素或文本的元素所需的方法 IAddChild container = dock_panel; container.AddChild(btn); container = this; container.AddChild(dock_panel); } void btn_Click(object sender, RoutedEventArgs e) { this.btn.Content = "Thanks!"; } }}

Program.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;//引用該命名空間namespace WPF_Code{ //繼承自Application class Program:Application { [STAThread()]//單線程單元不可少 static void Main()//整個程序的入口 { Program app_program = new Program(); app_program.MainWindow = new MyWindow();//當前啟動的窗體對象 app_program.MainWindow.ShowDialog();//窗體以對話框形式啟動 } }}

打開項目的屬性,設置啟動位置從Program啟動

按下F5,顯示結果

還可以動態的將XAML信息交給程序處理,動態生成相應的控制項,將後端代碼修改為

//需要引用以下三個命名空間using System.Windows;using System.Windows.Controls;using System.Windows.Markup;namespace WPF_Code{ //當前類要繼承處Window類 class MyWindow : Window { //一個未實例化的按鈕對象 private Button btn; //當前窗體的構造函數 public MyWindow() { InitializeComponent(); } //用於初始化窗體 private void InitializeComponent() { //創建XAML String xaml = " <StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Width="200" Height="200" Background="Blue" > <Button Content="Dynamic Button One" Background="Yellow"/> <Button Content="Dynamic Button Two" Background="Yellow"/> <Button Content="Dynamic Button Three" Background="Yellow"/> <TextBox Text="Dynamic TextBox" Background="LightGreen"/> </StackPanel>"; //指定XAML this.Content = XamlReader.Parse(xaml); } }}

運行結果如下:


推薦閱讀:
相关文章