← Back to list

virtualizing-wpf-ui
by christian289
ClaudeCode와 함께하는 .NET 개발 튜토리얼
⭐ 1🍴 0📅 Jan 25, 2026
SKILL.md
name: virtualizing-wpf-ui description: 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.
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"/>
Score
Total Score
65/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
✓最近の活動
1ヶ月以内に更新
+10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
✓タグ
1つ以上のタグが設定されている
+5
Reviews
💬
Reviews coming soon
