XAML (Extensible Application Markup Language) 可擴(kuò)展應(yīng)用程序標(biāo)記語言是一種基于 XML 的標(biāo)記語言易茬,以聲明形式實現(xiàn)應(yīng)用程序的外觀。 通常用它創(chuàng)建窗口、對話框萎羔、頁和用戶控件,并填充控件、形狀和圖形试疙,且自身即可實現(xiàn)動畫效果(通過blend
生成XAML)。
XAML中每個標(biāo)簽在運行時都會創(chuàng)建一個實例抠蚣。 例如祝旷, Window
元素被轉(zhuǎn)換為 Window
類的實例,該類的 Title
屬性是 Title
特性的值嘶窄。
命名空間 xmlns (XML Namespace)
xmlns[:自定義映射名] = "對應(yīng)的命名空間"
例如想引入類庫文件MyClass.dll中的命名空間ABC怀跛,則
xmlns:abc="clr-namespace:ABC;assembly=MyClass"
//效果類似于 using ABC = abc;
用于聲明命名空間,如下<Window>和<Grid>均屬于xmlns
聲明的默認(rèn)命名空間柄冲,x:Class
中的內(nèi)容則屬于xmlns:x
聲明的命名空間吻谋。其中配置的內(nèi)容并非網(wǎng)址,而是一個XAML內(nèi)置的一個對應(yīng)關(guān)系现横,該內(nèi)容對應(yīng)了多個命名空間漓拾。
通過在AssemblyInfo.cs
中添加[assembly:xmlnsDefinition("www.xxx.com","wpfLibrary")]
也可以將自己的網(wǎng)址設(shè)置成一個命名空間的對應(yīng)。
<Window x:Class="WpfTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
</Grid>
</Window>
經(jīng)過聲明的命名空間下的類可以直接作為標(biāo)簽被使用
<abc:Tab>...</abc:Tab>
為XAML的對象屬性賦值
- 使用字符串進(jìn)行簡單賦值
<Rectangle Grid.ColumnSpan="2" Fill="#F00" HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100"/>
- 使用屬性元素進(jìn)行復(fù)雜賦值
當(dāng)屬性是復(fù)雜對象時有優(yōu)勢
<Rectangle Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100">
<Rectangle.Fill>
<SolidColorBrush Color="#F0F"/>
</Rectangle.Fill>
</Rectangle>
- 標(biāo)記擴(kuò)展
通過"{Binding XXX=XXX}"
的方式將TextBox
的屬性依賴在Slider
的Value
上
<Slider Name="slider1" Height="30" Width="100"/>
<TextBox Text="{Binding ElementName=slider1,Path=Value,Mode=OneWay}" Height="30" TextWrapping="Wrap" Width="100"/>
或改用屬性元素
<TextBox Text="{Binding ElementName=slider1,Path=Value,Mode=OneWay}" Height="30" TextWrapping="Wrap" Width="100">
<TextBox.Text>
<Binding ElementName=slider1,Path=Value,Mode=OneWay>
</TextBox.Text>
</TextBox>
X名稱空間中的屬性
x:Class
x:Class
本身不是對象的成員戒祠,而是從x
命名空間中拿出來硬貼上去的骇两,且只能用于根節(jié)點
擁有x:Class
的標(biāo)簽會自動解析為一個類名為x:Class
的值的partial
類(稱為代碼隱藏類),其嵌套的標(biāo)簽會被解析為其派生類姜盈,編譯時會和.cs
文件中的同名partial
類合并脯颜。
擁有x:Class
的標(biāo)簽解析后的類自動擁有InitializeComponent
方法,用于初始化窗體組件贩据,將標(biāo)記中定義的 UI 與代碼隱藏類合并在一起。
通過Name
屬性在.cs
中獲取xaml
中對應(yīng)元素闸餐。
- x:ClassModifier
只能給有x:Class
屬性的標(biāo)簽添加饱亮,用于設(shè)置該類的訪問權(quán)限
x:Name
通常可與Name
互換舍沙。
當(dāng)一個標(biāo)簽具有x:Name
時近上,除了生成對應(yīng)實例外還會為這個實例聲明一個引用變量,變量名即x:Name
的值
- x:FieldModifier
擁有x:Name
的XAML標(biāo)簽實例拂铡,訪問權(quán)限默認(rèn)為internal
壹无。通過x:FieldModifier
可以設(shè)置為public
等葱绒。
x:Key 與 資源
為資源字典貼上用于檢索的索引。
<Window xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Window.Resources>
<sys:String x:Key="myString">hello this is String</sys:String>
</Window.Resources>
<TextBox Text="{StaticResource ResourceKey=myString}"/>
</Window>
在方法中也能獲取資源
String myString = this.FindResource("myString") as String;
- x:Shared
若為true
斗锭,每次通過x:Key
獲取的是同一個對象地淀,否則為一個新的副本。默認(rèn)為true
岖是。
x名稱空間中的標(biāo)記擴(kuò)展
x:Type帮毁,x:Null 與 Style
當(dāng)需要指定某值為null
時使用x:Null
如已經(jīng)指定了所有Button
的Style
,但有一個不需采用該Style
時
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Width" Value="50"></Setter>
</Style>
</Window.Resources>
<Button Style="{x:Null}"/>
x:Static
在XAML中直接使用類的static成員
<Button Content="{x:Static local:MainWindow.ButtonContent}"/>
...
public static string ButtonContent= "Click Me";
x:Array 與 ListBox
x:Array
用于暴露一個指定類型的ArrayList
/List
實例
<ListBox>
<ListBoxItem>1</ListBoxItem>
<ListBoxItem>2</ListBoxItem>
</ListBox>
等價于
<ListBox Name="listbox"></ListBox>
...
listbox.ItemsSource = new List<string>(new []{"1","2"});
等價于
<ListBox>
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>1</sys:String>
<sys:String>2</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
控件與布局
有些控件的內(nèi)容是一個集合豺撑,如StackPanel
的內(nèi)容屬性是Children
烈疚,ListBox
的內(nèi)容屬性是Items
,當(dāng)通過屬性元素賦值時可以省略該內(nèi)容屬性的標(biāo)簽聪轿。
ContentControl基類
包括Window
, ScrollViewer
爷肝,各種Button
,CheckBox
等
- 均具有內(nèi)容屬性
Content
- 內(nèi)部最多只能包含一個元素
Button
表示 Windows 按鈕控件陆错,該按鈕對 Click
事件作出反應(yīng)
- Click 綁定事件
- ClickMode 觸發(fā)方式
- Hover => mouseover
- Press => mousedown
- Release => mouseup
ItemsControl 基類
包括Menu
, ContextMenu
灯抛,ComboBox
,ListBox
危号,TabControl
等
- 內(nèi)容屬性為
Items
或ItemsSource
- 內(nèi)容應(yīng)為一個集合牧愁,且會自動被對應(yīng)的條目容器進(jìn)行包裝
如ListBox
的條目容器為ListBoxItem
,因此以下兩種寫法等效
<ListBox>
<Button Content="Click Me"/>
</ListBox>
<ListBox>
<ListBoxItem>
<Button Content="Click Me"/>
</ListBoxItem>
</ListBox>
- DisplayMemberPath 屬性
規(guī)定展示數(shù)組中每個對象的某個屬性
TextBlock 和 TextBox
用于文本展示
- TextBlock
具有豐富的格式/排版控制
內(nèi)容屬性為Inlines
- TextBox
支持用戶自己編輯
內(nèi)容屬性為Text
Panel基類與UI布局
內(nèi)容屬性均為Children
Grid 網(wǎng)格
類似Table外莲,適用于行列對齊等
默認(rèn)ColumnDefinition
擁有Width="1*"
猪半,RowDefinition
擁有Height="1*"
- 取值若為
px
,px
可省略 - 若為
Auto
偷线,則由其內(nèi)容撐開磨确,無內(nèi)容則不占空間(可用Min-Width
/Min-Height
設(shè)置最小值) - 若為
*
,則由剩余空間按值分配(類似于flex的伸縮占比)
<Grid Name="myGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="100px"></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1">hello</TextBlock>
</Grid>
...
myGrid.ColumnDefinitions.Add(new ColumnDefinition());
StackPanel
類似<div style="display:flex;"></div>
- Orientation 元素排列方式
Horizontal/Vertical - HorizontalAlignment 元素對齊方式
Left/Center/Right/Stretch - VerticalAlignment 元素對齊方式
Top/Center/Bottom/Stretch
Canvas
類似<div style="position:absolute;"></div>
其中的每個標(biāo)簽通過設(shè)置Canvas.Left
和Canvas.Top
屬性來確定位置
DockPanel
內(nèi)部元素通過DockPanel.Dock
選擇泊靠方向(類似浮動声邦,但具有四個方向)
- 最后一個子元素的
DockPanel.Dock
會被忽略乏奥,將盡量撐滿整個DockPanel
(可通過設(shè)置LastChildFill="false"
禁用該功能)
<DockPanel>
<TextBox BorderBrush="Blue" Height="100" DockPanel.Dock="Top">1</TextBox>
<TextBox BorderBrush="Blue" Width="100" DockPanel.Dock="Left">2</TextBox>
<TextBox BorderBrush="Blue">3</TextBox>
</DockPanel>
WrapPanel
流式布局,排滿一行自動換行(類似子元素全為inline-block
)
通過HorizontalAlignment
和VerticalAlignment
可以設(shè)置子元素整體在WrapPanel
中的位置(不影響子元素間的相對位置關(guān)系)
<WrapPanel HorizontalAlignment="Right" VerticalAlignment="Center">
<TextBox BorderBrush="Red" Width="100" Height="100">1</TextBox>
<TextBox BorderBrush="Red" Width="100" Height="100">2</TextBox>
<TextBox BorderBrush="Red" Width="100" Height="100">3</TextBox>
<TextBox BorderBrush="Red" Width="100" Height="100">4</TextBox>
<TextBox BorderBrush="Red" Width="100" Height="100">5</TextBox>
</WrapPanel>
動態(tài)修改XAML
Grid grid = new Grid();
grid.ColumnDefinitions.Add(new ColumnDefinition());
grid.ColumnDefinitions.Add(new ColumnDefinition());
grid.ColumnDefinitions.Add(new ColumnDefinition());
grid.RowDefinitions.Add(new RowDefinition());
grid.RowDefinitions.Add(new RowDefinition());
grid.RowDefinitions.Add(new RowDefinition());
Button button = new Button() { Content="hello"};
Grid.SetColumn(button, 1);
Grid.SetRow(button, 1);
grid.Children.Add(button);
Content = grid;
事件處理器
一個XAML標(biāo)簽對應(yīng)一個對象亥曹,標(biāo)簽的一部分屬性對應(yīng)對象的屬性邓了,另一部分則對應(yīng)對象的事件。如:
<Button Name="button" Click="Button_Click"/>
約等于
private void Button_Click(object sender, RoutedEventArgs e){}
Button button = new Button();
button.click+=new RoutedEventHandler(Button_Click);
在事件中獲取對象可以直接使用x:Name
的值媳瞪,也可以使用形參中的sender
(即為事件的綁定者)骗炉,配合.Children[0]
等選取標(biāo)簽。
定位
- Margin
按照左上右下依次定義蛇受,默認(rèn)為"0,0,0,0"
- HorizontalAlignment
水平定位句葵,決定了Margin優(yōu)先用左右哪個值,默認(rèn)為"Left"
- VerticalAlignment
垂直定位,決定了Margin優(yōu)先用上下哪個值乍丈,默認(rèn)為"Top"