版面配置是 XAML UI 的骨架。WinRT 提供六大核心面板,各有適用場景:Canvas(絕對定位)、Grid(網格彈性)、StackPanel(流式堆疊)、VirtualizingStackPanel(虛擬化堆疊)、WrapGrid(自動換行網格)、VariableSizedWrapGrid(可變尺寸換行)。本文逐一解析語法、屬性與實戰範例。
子元素透過附加屬性 Canvas.Left、Canvas.Top 指定相對 Canvas 左上角座標。Canvas 不會限制子元素大小,子元素可超出邊界。
<Canvas HorizontalAlignment="Left" VerticalAlignment="Top"
Background="Red" Width="100" Height="100" Margin="120 0 0 0">
<Canvas Background="Green" Width="200" Height="200"
Canvas.Left="120" Canvas.Top="120">
<TextBlock Text="TextBlock" Canvas.Top="20"/>
</Canvas>
</Canvas>
💡 適用場景:繪圖板、遊戲場景、自由拖曳元素、座標精確控制的覆蓋層。
透過 RowDefinitions、ColumnDefinitions 定義列/行,子元素用 Grid.Row、Grid.Column、Grid.RowSpan、Grid.ColumnSpan 定位。
Auto:依內容自適應(預設)Pixel:固定像素(如 50)Star (*):比例分配剩餘空間(* 全部、2* 和 8* 為 2:8)<Grid Background="Blue" Width="300" Height="300" Canvas.ZIndex="100">
<Grid.RowDefinitions>
<RowDefinition Height="50"/> <!-- 固定 50 -->
<RowDefinition Height="3*"/> <!-- 3 份 -->
<RowDefinition Height="7*"/> <!-- 7 份 -->
<RowDefinition Height="*" MinHeight="50" MaxHeight="100"/> <!-- 1 份,限制範圍 -->
<RowDefinition Height="Auto"/> <!-- 自適應 -->
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" Background="Red" Text="webabcd"/>
<TextBox Grid.Row="0" Grid.Column="1" Background="Red" Text="webabcd" Grid.ColumnSpan="2" HorizontalAlignment="Center"/>
<TextBox Grid.Row="1" Grid.Column="0" Background="Red" Text="webabcd"/>
<TextBox Grid.Row="1" Grid.Column="1" Background="Red" Text="webabcd" Grid.ColumnSpan="2" HorizontalAlignment="Center"/>
<TextBox Grid.Row="2" Grid.Column="0" Background="Red" Text="webabcd"/>
<TextBox Grid.Row="2" Grid.Column="1" Background="Red" Text="webabcd" Grid.RowSpan="2" VerticalAlignment="Bottom"/>
<TextBox Grid.Row="2" Grid.Column="2" Background="Red" Text="webabcd"/>
<TextBox Grid.Row="3" Grid.Column="2" Background="Red" Text="webabcd"/>
<TextBox Grid.Row="4" Grid.Column="2" Background="Red" Text="webabcd"/>
</Grid>
<!-- Canvas.ZIndex 可用於任意元素疊序控制 -->
<Rectangle Margin="10 50 100 150" Fill="Green" Canvas.ZIndex="10"/>
HorizontalAlignment=Stretch、VerticalAlignment=StretchMargin 而非 Canvas 座標Canvas.ZIndex 為附加屬性,可用於任何元素控制 Z 軸順序Orientation:Horizontal(水平)、Vertical(垂直,預設)。子元素依序排列,不換行。
<StackPanel HorizontalAlignment="Left" Margin="120 0 0 0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="a" Margin="5"/>
<TextBlock Text="b" Margin="5"/>
<TextBlock Text="c" Margin="5"/>
</StackPanel>
<StackPanel Orientation="Vertical">
<TextBlock Text="a" Margin="5"/>
<TextBlock Text="b" Margin="5"/>
<TextBlock Text="c" Margin="5"/>
</StackPanel>
</StackPanel>
💡 適用場景:表單欄位、工具列、簡單垂直/水平列表。
繼承 VirtualizingPanel,僅建立可視區內的 UI 元素,大幅提升大量資料效能。只能用於 ItemsControl 衍生控件(ListBox、ListView、FlipView 等)的 ItemsPanel,不可直接放入一般頁面。
Orientation:Vertical/HorizontalVirtualizationMode:Recycling(容器重用,預設)、Standard(各項目獨立容器)<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical"
VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
⚠️ 注意:ListBox 預設已使用 VirtualizingStackPanel,但對可變高度 DataTemplate 支援較差。
繼承 VirtualizingPanel,支援虛擬化。子元素依 Orientation 排列,超出 MaximumRowsOrColumns 自動換行/換列。
Orientation:Vertical(直向排滿換列)、Horizontal(橫向排滿換行)MaximumRowsOrColumns:最大行/列數ItemWidth/ItemHeight:每個格子尺寸(可選)VerticalChildrenAlignment/HorizontalChildrenAlignment:格子內對齊<GridView.ItemsPanel>
<ItemsPanelTemplate>
<WrapGrid MaximumRowsOrColumns="3" Orientation="Vertical"
VerticalChildrenAlignment="Top" HorizontalChildrenAlignment="Left"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
不繼承 VirtualizingPanel,無虛擬化,適合項目數較少但尺寸多變的場景。支援 ColumnSpan/RowSpan 讓項目跨越多格。
Orientation:Horizontal/VerticalItemWidth/ItemHeight:基礎格子尺寸MaximumRowsOrColumns:最大行/列數VariableSizedWrapGrid.ColumnSpan、RowSpan<VariableSizedWrapGrid Orientation="Horizontal" HorizontalAlignment="Left"
Background="Green" Width="1000" Margin="0 10 0 0">
<VariableSizedWrapGrid.Children>
<Image Source="/Assets/Logo.png" Width="100" Height="100" Margin="10"/>
<!-- 重複 15 個 -->
</VariableSizedWrapGrid.Children>
</VariableSizedWrapGrid>
PrepareContainerForItemOverride 設定 ColumnSpan/RowSpan| 面板 | 虛擬化 | 適用場景 | 可變尺寸 |
|---|---|---|---|
| Canvas | 否 | 絕對定位、繪圖、遊戲 | N/A |
| Grid | 否 | 複雜表單、響應式佈局、主頁面架構 | RowSpan/ColSpan |
| StackPanel | 否 | 簡單線性堆疊 | 否 |
| VirtualizingStackPanel | 是 | ListBox/ListView 大量資料垂直/水平列表 | 否 |
| WrapGrid | 是 | GridView 大量資料自動換行網格 | 否 |
| VariableSizedWrapGrid | 否 | 項目尺寸多變、項目數較少(<100) | ColumnSpan/RowSpan |
掌握六大面板特性與適用場景,能讓你:
記住:虛擬化面板僅限 ItemsControl 使用,一般頁面佈局請用 Grid/StackPanel/Canvas。