From wpf-dev-pack
Implements WPF UI virtualization with VirtualizingStackPanel for ItemsControl, ListView, DataGrid. Optimizes memory and performance for 1000+ items.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wpf-dev-pack:virtualizing-wpf-uisonnetThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```xml
<ListBox ItemsSource="{Binding LargeCollection}"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingPanel.CacheLength="2,2"
VirtualizingPanel.CacheLengthUnit="Page"/>
| Property | Recommended | Purpose |
|---|---|---|
IsVirtualizing | True | Enable virtualization |
VirtualizationMode | Recycling | Reuse containers |
ScrollUnit | Pixel | Smooth scrolling |
CacheLength | "1,1" to "2,2" | Buffer pages |
These disable virtualization:
<!-- ❌ ScrollViewer wrapper -->
<ScrollViewer>
<ListBox/>
</ScrollViewer>
<!-- ❌ CanContentScroll disabled -->
<ListBox ScrollViewer.CanContentScroll="False"/>
<!-- ❌ Grouping without flag -->
<ListBox>
<ListBox.GroupStyle>...</ListBox.GroupStyle>
</ListBox>
Fixes:
<!-- ✅ No wrapper needed - ListBox has built-in ScrollViewer -->
<ListBox ItemsSource="{Binding Items}"/>
<!-- ✅ Grouping with virtualization -->
<ListBox VirtualizingPanel.IsVirtualizingWhenGrouping="True">
<ListBox.GroupStyle>...</ListBox.GroupStyle>
</ListBox>
// 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
}
<!-- Faster scrollbar dragging -->
<ListBox ScrollViewer.IsDeferredScrollingEnabled="True"/>
public static bool IsVirtualizing(ItemsControl control)
{
var panel = FindVisualChild<VirtualizingStackPanel>(control);
return panel != null && VirtualizingPanel.GetIsVirtualizing(control);
}
public static int GetRealizedCount(ItemsControl control)
{
var generator = control.ItemContainerGenerator;
return Enumerable.Range(0, control.Items.Count)
.Count(i => generator.ContainerFromIndex(i) != null);
}
<DataGrid ItemsSource="{Binding Items}"
EnableRowVirtualization="True"
EnableColumnVirtualization="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"/>
npx claudepluginhub christian289/dotnet-with-claudecode --plugin wpf-dev-packOptimizes large lists with virtual scrolling/windowing. Supports react-window, TanStack Virtual, variable-height rows, infinite scroll, and grid virtualization.
Virtualizes MUI lists with react-window FixedSizeList/VariableSizeList, react-virtuoso, and Autocomplete patterns for rendering 1000+ items without layout thrashing or memory issues.
Explains WPF rendering pipeline including Measure/Arrange/Render passes, invalidation methods, and hardware acceleration tiers. Use for debugging layouts, optimizing performance, or diagnosing software rendering.