Canvas 是 WPF 最原始的佈容器,提供**絕對座標定位**。書作者不建議常規 UI 使用 (因內容尺寸常隨字體/圖片動態變化),但特定場景 (繪圖、遊戲、拖放、固定版面) 不可或缺。
定位屬性
Canvas.Left / Canvas.Right:距左/右邊緣距離 (互斥,優先 Left)。
Canvas.Top / Canvas.Bottom:距頂/底邊緣距離 (互斥,優先 Top)。
- 未設定者預設為 0。
代碼示例:雙錨點定位
<Canvas Background="Yellow">
<TextBlock Canvas.Left="10" Canvas.Top="20">Hello</TextBlock>
<TextBlock Canvas.Right="10" Canvas.Bottom="20">world!</TextBlock>
</Canvas>
行為觀察:調整視窗大小,第二個 TextBlock 位置隨之變化,**但與右/底邊緣距離恆定 (10, 20)**。這是「右/底錨點」特性。
ClipToBounds:內容裁剪開關
| 值 | 行為 | 預設 |
False | 超出 Canvas 邊界的內容**繼續顯示** (溢出可見) | ✓ |
True | 超出邊界內容**被裁剪**隱藏 | |
<Canvas Background="Yellow" ClipToBounds="True">
<Ellipse Canvas.Left="80" Canvas.Top="80" Width="100" Height="100" Fill="Red" />
</Canvas>
<!-- Canvas 150x150 時,圓形右下 1/4 被裁剪 -->
配合 ViewBox 實現響應式固定佈局
<Viewbox Stretch="Uniform">
<Canvas Width="800" Height="600">
<!-- 固定座標繪圖/佈局 -->
</Canvas>
</Viewbox>
邏輯座標系 (800x600) 固定不變,ViewBox 負責整體縮放適配螢幕,結合兩者優點。
Z-Index 控制重疊順序
<Canvas>
<Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="50" Fill="Red" Canvas.ZIndex="1" />
<Rectangle Canvas.Left="30" Canvas.Top="30" Width="50" Height="50" Fill="Blue" Canvas.ZIndex="2" /> <!-- 覆蓋紅色 -->
</Canvas>
適用場景總結
- ✅ 向量繪圖、圖表渲染 (邏輯座標固定)
- ✅ 遊戲場景、粒子系統 (高頻座標更新)
- ✅ 拖放操作區域 (自由移動)
- ✅ 固定版面列印預覽 (A4 等精確尺寸)
- ❌ 表單、清單、自適應響應式 UI (請用 Grid/StackPanel)
Canvas 是「手術刀」而非「瑞士刀」—— 用對地方極其強大,濫用則維護地獄。
- 上一篇文章: WPF 筆記:ViewBox 縮放容器與 Stretch 模式詳解
- 下一篇文章: WPF 筆記:Grid 佈局深度解析 (列寬/共享尺寸組/附加屬性)
Copyright ©
程式碼之家 All Rights Reserved