Implements WPF UI virtualization for large data sets using VirtualizingStackPanel. Use when displaying 1000+ items in ItemsControl, ListView, or DataGrid to prevent memory and performance issues.
View on GitHubchristian289/dotnet-with-claudecode
wpf-dev-pack
January 23, 2026
Select agents to install to:
npx add-skill https://github.com/christian289/dotnet-with-claudecode/blob/main/wpf-dev-pack/skills/virtualizing-wpf-ui/SKILL.md -a claude-code --skill virtualizing-wpf-uiInstallation paths:
.claude/skills/virtualizing-wpf-ui/# WPF UI Virtualization
## Quick Setup
```xml
<ListBox ItemsSource="{Binding LargeCollection}"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingPanel.CacheLength="2,2"
VirtualizingPanel.CacheLengthUnit="Page"/>
```
## Key Properties
| Property | Recommended | Purpose |
|----------|-------------|---------|
| `IsVirtualizing` | True | Enable virtualization |
| `VirtualizationMode` | Recycling | Reuse containers |
| `ScrollUnit` | Pixel | Smooth scrolling |
| `CacheLength` | "1,1" to "2,2" | Buffer pages |
## Virtualization Breakers
**These disable virtualization:**
```xml
<!-- ❌ ScrollViewer wrapper -->
<ScrollViewer>
<ListBox/>
</ScrollViewer>
<!-- ❌ CanContentScroll disabled -->
<ListBox ScrollViewer.CanContentScroll="False"/>
<!-- ❌ Grouping without flag -->
<ListBox>
<ListBox.GroupStyle>...</ListBox.GroupStyle>
</ListBox>
```
**Fixes:**
```xml
<!-- ✅ No wrapper needed - ListBox has built-in ScrollViewer -->
<ListBox ItemsSource="{Binding Items}"/>
<!-- ✅ Grouping with virtualization -->
<ListBox VirtualizingPanel.IsVirtualizingWhenGrouping="True">
<ListBox.GroupStyle>...</ListBox.GroupStyle>
</ListBox>
```
## Recycling Mode Considerations
```csharp
// When using Recycling mode, clean up in PrepareContainerForItemOverride
protected override void PrepareContainerForItemOverride(
DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var container = (ListBoxItem)element;
// Reset any manually attached handlers or state
}
```
## Performance Tips
### Deferred Scrolling
```xml
<!-- Faster scrollbar dragging -->
<ListBox ScrollViewer.IsDeferredScrollingEnabled="True"/>
```
### Diagnostic Check
```csharp
public static bool IsVirtualizing(ItemsControl control)
{
var panel = FindVisualChild<VirtualizingStackPanel>(control);
return panel != null && Virtual