本案例完整複刻 Windows 7 任務列行為:雙擊桌面捷徑開啟子視窗、任務列自動生成圖標、滑鼠懸停顯示即時縮圖預覽、點擊圖標切換視窗最大化/最小化。

原始碼下載:StatusBar.rar
將子視窗 (Window) 直接作為 VisualBrush 的 Visual 來源,填充 Rectangle,即可獲得即時縮圖:
Rectangle emptyRectangle = new Rectangle
{
Width = 250,
Height = 130,
Fill = new VisualBrush { Visual = childWindow },
Margin = new Thickness(2)
};
// 內層:縮圖圓角
Border visualBorder = new Border
{
BorderBrush = Brushes.Transparent,
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(10),
Margin = new Thickness(10),
Height = 150,
Width = 270,
Child = emptyRectangle,
Background = FindResource("transparentColor") as LinearGradientBrush
};
// 外層:背景圓角
Border host = new Border
{
BorderBrush = Brushes.Transparent,
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8),
Child = visualBorder,
Background = FindResource("thumbnailBackground") as ImageBrush
};
利用 ToolTip 的浮動特性顯示縮圖,設定極短延遲 (InitialShowDelay=20ms) 實現即時響應:
ToolTip visualToolTip = new ToolTip
{
Content = host,
Background = Brushes.Transparent,
BorderBrush = Brushes.Transparent,
Placement = PlacementMode.Top,
HorizontalContentAlignment = HorizontalAlignment.Center,
VerticalContentAlignment = VerticalAlignment.Center,
HasDropShadow = false,
VerticalOffset = 3
};
ToolTipService.SetInitialShowDelay(taskbarButton, 20);
taskbarButton.ToolTip = visualToolTip;
// 子視窗關閉時移除任務列圖標
childWindow.Closed += (s, e) => statusBar.Children.Remove(hostBorder);
// 點擊任務列圖標:最小化/還原切換
taskbarButton.MouseLeftButtonDown += (s, e) =>
{
if (e.ClickCount == 1)
{
if (childWindow.WindowState == WindowState.Minimized)
{
childWindow.WindowState = WindowState.Normal;
childWindow.Topmost = true;
}
else
childWindow.WindowState = WindowState.Minimized;
}
};
向任務列 StackPanel 添加圖標時,必須採用由上至下的添加順序(Children.Insert(0, ...) 或依序 Add),避免 WPF 視覺樹重複渲染邏輯導致效能下降。