ViewBox 是單一子元素的裝飾器,能將子內容**等比或非等比縮放**填充可用空間。常搭配 Canvas 使用,讓固定座標繪圖具備響應式縮放能力。
| 模式 | 行為 | 比例保持 | 填滿空間 | 適用場景 |
|---|---|---|---|---|
| Uniform (預設) | 等比縮放,完整顯示內容 | ✓ | 否 (留白) | 圖標、繪圖、保持比例的 UI |
| Fill | 非等比拉伸,強制填滿 | ✗ | ✓ | 背景圖、不在意變形的填充 |
| None | 不縮放,保持原始尺寸 | ✓ | 否 | 固定尺寸內容、調試用 |
| UniformToFill | 等比縮放至**完全覆蓋**,超出裁剪 | ✓ | ✓ (裁剪) | 全螢幕背景、封面圖、Hero 區塊 |
<Viewbox Stretch="Uniform">
<Canvas Width="200" Height="100">
<Ellipse Canvas.Left="10" Canvas.Top="10" Width="50" Height="50" Fill="Red" />
<TextBlock Canvas.Left="70" Canvas.Top="20" Text="Hello" FontSize="16" />
</Canvas>
</Viewbox>
Canvas 內座標為邏輯座標 (200x100);ViewBox 根據外部空間自動縮放整個 Canvas 及其子元素,**座標關係完全保持**。
ViewBox 繼承 Decorator,只能包含**一個**直接子元素。多元素請用 Grid/StackPanel 包裹後再放入。DesiredSize、ActualWidth 仍為邏輯值 (200x100);縮放僅發生在渲染層 (RenderTransform 內部實現)。Uniform、內層 Fill 等組合可產生複雜縮放行為,但極少必要。FrameworkElement → Decorator,不參與子元素佈局協商,只負責最終渲染縮放。ViewBox 任意縮放至 16/24/48/64 像素,銳利無鋸齒。ViewBox Uniform 自適應視窗大小。ViewBox 縮放至螢幕寬度預覽。ViewBox 寬高做動畫,內容自動跟隨縮放,比對每個子元素做 Transform 簡潔得多。作者註:「老實說這節我沒看太懂,讓我再 try 一下」—— 實踐是檢驗真理的唯一標準,建議在 Kaxaml/LINQPad 即時調試四種 Stretch 模式差異。