원클릭으로
wpf-rule-virtualization-patterns
WPF UI virtualization for large collections: VirtualizingStackPanel, recycling, pixel scroll.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
WPF UI virtualization for large collections: VirtualizingStackPanel, recycling, pixel scroll.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
WPF IValueConverter rules: MarkupExtension singleton, pure functions, null/UnsetValue handling, TemplateBinding.
WPF Freezable performance rules: Freeze() all Brush/Pen/Geometry; create-and-freeze in constructor, reuse in OnRender.
WPF MVVM layer-separation rules: no System.Windows in ViewModels, BCL-only types, CommunityToolkit.Mvvm base classes. Preloaded into MVVM-related wpf-dev-pack agents.
Banned wpf-dev-pack patterns (P-001..P-004): ViewModelLocator, code-behind DataContext, Stateless ViewModel, mixing composition paths.
WPF rendering anti-patterns: no InvalidateVisual in loops, no resource allocation in OnRender.
WPF ResourceDictionary rules: Generic.xaml as MergedDictionaries hub only, per-control style files, resource order.
| name | wpf-rule-virtualization-patterns |
| description | WPF UI virtualization for large collections: VirtualizingStackPanel, recycling, pixel scroll. |
| user-invocable | false |
UI virtualization rules for WPF controls that display large collections.
Plain ItemsControl does not virtualize by default — it materializes every item at load.
For large collections, replace the default panel with VirtualizingStackPanel and enable container recycling.
<!-- Wrong: no virtualization, all items materialized at once -->
<ItemsControl ItemsSource="{Binding LargeCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<!-- Correct: VirtualizingStackPanel with recycling -->
<ItemsControl ItemsSource="{Binding LargeCollection}"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.ScrollUnit="Pixel"
ScrollViewer.CanContentScroll="True">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
ListView and ListBox use a VirtualizingStackPanel by default, but the optimal settings must still be set explicitly via attached properties:
<ListView ItemsSource="{Binding LargeCollection}"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.ScrollUnit="Pixel"
ScrollViewer.CanContentScroll="True">
...
</ListView>
| Attached Property | Recommended Value | Effect |
|---|---|---|
VirtualizingPanel.IsVirtualizing | True | Enable UI virtualization |
VirtualizingPanel.VirtualizationMode | Recycling | Reuse containers instead of re-creating |
VirtualizingPanel.ScrollUnit | Pixel | Smooth pixel scrolling (vs. item-by-item) |
ScrollViewer.CanContentScroll | True | Required for panel-level virtualization |
VirtualizationMode="Recycling" is almost always preferred over Standard — it avoids GC pressure from container creation/destruction during scroll.ScrollUnit="Pixel" eliminates the "jumping" effect that occurs with item-based scrolling when items have variable height.ScrollViewer wrapping the items panel has CanContentScroll="False" — always verify this setting.VirtualizingStackPanel inside an ScrollViewer with unconstrained height — it will lose virtualization because all items become "visible".