dotnet/wpf · error · InvalidOperationException
SR.PageCacheSizeNotAllowed
Error message
SR.PageCacheSizeNotAllowed
What it means
The HierarchicalVirtualizationConstraints property on TreeViewItem rejects VirtualizationCacheLengthUnit.Page cache units, throwing InvalidOperationException. For hierarchical (TreeView) virtualization only Item or Pixel cache units are permitted; a Page-sized cache is not supported on this control type.
Solutions
- Change the cache unit to VirtualizationCacheLengthUnit.Item or .Pixel.
- Use separate styles for TreeViewItem versus ListBox/ItemsControl virtualization settings.
- If bindings set the value, add a converter that translates Page into Pixel/Item.
Example fix
// before
treeViewItem.HierarchicalVirtualizationConstraints =
new HierarchicalVirtualizationConstraints(new VirtualizationCacheLength(1), VirtualizationCacheLengthUnit.Page, 0);
// after
treeViewItem.HierarchicalVirtualizationConstraints =
new HierarchicalVirtualizationConstraints(new VirtualizationCacheLength(1), VirtualizationCacheLengthUnit.Pixel, 0); Defensive patterns
Strategy: validation
Validate before calling
if (constraints.CacheLengthUnit == VirtualizationCacheLengthUnit.Page)
constraints = new HierarchicalVirtualizationConstraints(constraints.CacheLength, VirtualizationCacheLengthUnit.Pixel, 0);
treeViewItem.HierarchicalVirtualizationConstraints = constraints; Try / catch
try { item.HierarchicalVirtualizationConstraints = c; }
catch (InvalidOperationException) { /* Page cache not allowed on TreeViewItem; use Pixel/Item */ } Prevention
- Never use VirtualizationCacheLengthUnit.Page on TreeViewItem constraints.
- Keep TreeView virtualization styles separate from flat-list styles.
- Prefer Pixel or Item cache units for hierarchical virtualization.
When it happens
Trigger: Setting itemHierarchicalVirtualizationConstraints.CacheLengthUnit = VirtualizationCacheLengthUnit.Page on a TreeViewItem (directly or via binding), then triggering the setter.
Common situations: Copying virtualization settings from a flat ItemsControl (which supports Page) to a TreeView; configuring HierarchicalVirtualizationCacheLength in a style shared across control types.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- SR.Format(SR.CannotRemoveUnrealizedItems, index, count)
- SR.GenerationNotInProgress
- AnchorItem ' ' does not have a realized container and hence…
- Animation_Invalid_DefaultValue
- Cannot remove signature from read-only file.
AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14).
Data as JSON: /api/errors/6d3c2f82719826f2.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/TreeViewItem.cs:354
#region Internal Methods
protected override Size ArrangeOverride(Size arrangeSize)
{
arrangeSize = base.ArrangeOverride(arrangeSize);
Helper.ComputeCorrectionFactor(ParentTreeView, this, ItemsHost, HeaderElement);
return arrangeSize;
}
HierarchicalVirtualizationConstraints IHierarchicalVirtualizationAndScrollInfo.Constraints
{
get { return GroupItem.HierarchicalVirtualizationConstraintsField.GetValue(this); }
set
{
if (value.CacheLengthUnit == VirtualizationCacheLengthUnit.Page)
{
throw new InvalidOperationException(SR.PageCacheSizeNotAllowed);
}
GroupItem.HierarchicalVirtualizationConstraintsField.SetValue(this, value);
}
}
HierarchicalVirtualizationHeaderDesiredSizes IHierarchicalVirtualizationAndScrollInfo.HeaderDesiredSizes
{
get
{
FrameworkElement headerElement = HeaderElement;
Size pixelHeaderSize = this.IsVisible && headerElement != null ? headerElement.DesiredSize : new Size();
Helper.ApplyCorrectionFactorToPixelHeaderSize(ParentTreeView, this, ItemsHost, ref pixelHeaderSize);
Size logicalHeaderSize = new Size(DoubleUtil.GreaterThanZero(pixelHeaderSize.Width) ? 1 : 0,
DoubleUtil.GreaterThanZero(pixelHeaderSize.Height) ? 1 : 0);
return new HierarchicalVirtualizationHeaderDesiredSizes(logicalHeaderSize, pixelHeaderSize);View on GitHub (pinned to 81131a70a4)