|
|
|
@ -22,7 +22,6 @@ namespace Avalonia.Controls.Presenters |
|
|
|
nameof(VirtualizationMode), |
|
|
|
defaultValue: ItemVirtualizationMode.None); |
|
|
|
|
|
|
|
private ItemVirtualizer _virtualizer; |
|
|
|
private bool _canHorizontallyScroll; |
|
|
|
private bool _canVerticallyScroll; |
|
|
|
|
|
|
|
@ -76,21 +75,27 @@ namespace Avalonia.Controls.Presenters |
|
|
|
/// <inheritdoc/>
|
|
|
|
bool ILogicalScrollable.IsLogicalScrollEnabled |
|
|
|
{ |
|
|
|
get { return _virtualizer?.IsLogicalScrollEnabled ?? false; } |
|
|
|
get { return Virtualizer?.IsLogicalScrollEnabled ?? false; } |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
Size IScrollable.Extent => _virtualizer.Extent; |
|
|
|
Size IScrollable.Extent => Virtualizer?.Extent ?? Size.Empty; |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
Vector IScrollable.Offset |
|
|
|
{ |
|
|
|
get { return _virtualizer.Offset; } |
|
|
|
set { _virtualizer.Offset = CoerceOffset(value); } |
|
|
|
get { return Virtualizer?.Offset ?? new Vector(); } |
|
|
|
set |
|
|
|
{ |
|
|
|
if (Virtualizer != null) |
|
|
|
{ |
|
|
|
Virtualizer.Offset = CoerceOffset(value); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
Size IScrollable.Viewport => _virtualizer.Viewport; |
|
|
|
Size IScrollable.Viewport => Virtualizer?.Viewport ?? Bounds.Size; |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
Action ILogicalScrollable.InvalidateScroll { get; set; } |
|
|
|
@ -101,6 +106,8 @@ namespace Avalonia.Controls.Presenters |
|
|
|
/// <inheritdoc/>
|
|
|
|
Size ILogicalScrollable.PageScrollSize => new Size(0, 1); |
|
|
|
|
|
|
|
internal ItemVirtualizer Virtualizer { get; private set; } |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
bool ILogicalScrollable.BringIntoView(IControl target, Rect targetRect) |
|
|
|
{ |
|
|
|
@ -110,29 +117,30 @@ namespace Avalonia.Controls.Presenters |
|
|
|
/// <inheritdoc/>
|
|
|
|
IControl ILogicalScrollable.GetControlInDirection(NavigationDirection direction, IControl from) |
|
|
|
{ |
|
|
|
return _virtualizer?.GetControlInDirection(direction, from); |
|
|
|
return Virtualizer?.GetControlInDirection(direction, from); |
|
|
|
} |
|
|
|
|
|
|
|
public override void ScrollIntoView(object item) |
|
|
|
{ |
|
|
|
_virtualizer?.ScrollIntoView(item); |
|
|
|
Virtualizer?.ScrollIntoView(item); |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
protected override Size MeasureOverride(Size availableSize) |
|
|
|
{ |
|
|
|
return _virtualizer?.MeasureOverride(availableSize) ?? Size.Empty; |
|
|
|
return Virtualizer?.MeasureOverride(availableSize) ?? Size.Empty; |
|
|
|
} |
|
|
|
|
|
|
|
protected override Size ArrangeOverride(Size finalSize) |
|
|
|
{ |
|
|
|
return _virtualizer?.ArrangeOverride(finalSize) ?? Size.Empty; |
|
|
|
return Virtualizer?.ArrangeOverride(finalSize) ?? Size.Empty; |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
protected override void PanelCreated(IPanel panel) |
|
|
|
{ |
|
|
|
_virtualizer = ItemVirtualizer.Create(this); |
|
|
|
Virtualizer?.Dispose(); |
|
|
|
Virtualizer = ItemVirtualizer.Create(this); |
|
|
|
((ILogicalScrollable)this).InvalidateScroll?.Invoke(); |
|
|
|
|
|
|
|
if (!Panel.IsSet(KeyboardNavigation.DirectionalNavigationProperty)) |
|
|
|
@ -149,7 +157,7 @@ namespace Avalonia.Controls.Presenters |
|
|
|
|
|
|
|
protected override void ItemsChanged(NotifyCollectionChangedEventArgs e) |
|
|
|
{ |
|
|
|
_virtualizer?.ItemsChanged(Items, e); |
|
|
|
Virtualizer?.ItemsChanged(Items, e); |
|
|
|
} |
|
|
|
|
|
|
|
private Vector CoerceOffset(Vector value) |
|
|
|
@ -162,8 +170,8 @@ namespace Avalonia.Controls.Presenters |
|
|
|
|
|
|
|
private void VirtualizationModeChanged(AvaloniaPropertyChangedEventArgs e) |
|
|
|
{ |
|
|
|
_virtualizer?.Dispose(); |
|
|
|
_virtualizer = ItemVirtualizer.Create(this); |
|
|
|
Virtualizer?.Dispose(); |
|
|
|
Virtualizer = ItemVirtualizer.Create(this); |
|
|
|
((ILogicalScrollable)this).InvalidateScroll?.Invoke(); |
|
|
|
} |
|
|
|
} |
|
|
|
|