virtualizing-wpf-ui
WPF UI Virtualization
Quick Setup
<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:
<!-- ❌ 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>
Recycling Mode Considerations
// 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
<!-- Faster scrollbar dragging -->
<ListBox ScrollViewer.IsDeferredScrollingEnabled="True"/>
Diagnostic Check
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 Virtualization
<DataGrid ItemsSource="{Binding Items}"
EnableRowVirtualization="True"
EnableColumnVirtualization="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"/>
More from christian289/dotnet-with-claudecode
converting-html-css-to-wpf-xaml
Converts HTML/CSS to WPF CustomControl XAML with correct patterns and common pitfall solutions. Use when transforming web designs to WPF, converting CSS animations to Storyboards, implementing CSS border-radius clipping, CSS pseudo-elements (::before/::after), or CSS transforms in XAML.
56publishing-wpf-apps
Guides WPF application publishing and installer options. Use when user mentions publish, deploy, release, packaging, or installer to help choose deployment method and installer technology.
14using-avalonia-collectionview
Provides CollectionView alternatives for AvaloniaUI using DataGridCollectionView and ReactiveUI. Use when filtering, sorting, or grouping collections in AvaloniaUI applications.
9designing-avalonia-customcontrol-architecture
Defines the basic solution structure for AvaloniaUI Desktop Applications using CustomControl. Use when creating new AvaloniaUI projects or designing stand-alone control styles with ControlTheme.
9using-xaml-property-element-syntax
Converts long inline XAML bindings to Property Element Syntax for better readability. Use when XAML binding expressions become too long or complex.
8managing-styles-resourcedictionary
Manages WPF Style definitions and ResourceDictionary patterns including BasedOn inheritance and resource merging. Use when building theme systems, organizing resources, or choosing between StaticResource and DynamicResource.
8