@ -16,6 +16,8 @@ namespace Avalonia.Controls.Presenters
/// </summary>
internal abstract class ItemVirtualizer : IVirtualizingController , IDisposable
{
private double _ crossAxisOffset ;
/// <summary>
/// Initializes a new instance of the <see cref="ItemVirtualizer"/> class.
/// </summary>
@ -60,7 +62,7 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Gets a value indicating whether the items should be scroll horizontally or vertically.
/// </summary>
public bool Vertical = > VirtualizingPanel . ScrollDirection = = Orientation . Vertical ;
public bool Vertical = > VirtualizingPanel ? . ScrollDirection = = Orientation . Vertical ;
/// <summary>
/// Gets a value indicating whether logical scrolling is enabled.
@ -85,12 +87,28 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Gets the <see cref="ExtentValue"/> as a <see cref="Size"/>.
/// </summary>
public Size Extent = > Vertical ? new Size ( 0 , ExtentValue ) : new Size ( ExtentValue , 0 ) ;
public Size Extent
{
get
{
return Vertical ?
new Size ( Owner . Panel . DesiredSize . Width , ExtentValue ) :
new Size ( ExtentValue , Owner . Panel . DesiredSize . Height ) ;
}
}
/// <summary>
/// Gets the <see cref="ViewportValue"/> as a <see cref="Size"/>.
/// </summary>
public Size Viewport = > Vertical ? new Size ( 0 , ViewportValue ) : new Size ( ViewportValue , 0 ) ;
public Size Viewport
{
get
{
return Vertical ?
new Size ( Owner . Panel . Bounds . Width , ViewportValue ) :
new Size ( ViewportValue , Owner . Panel . Bounds . Height ) ;
}
}
/// <summary>
/// Gets or sets the <see cref="OffsetValue"/> as a <see cref="Vector"/>.
@ -99,12 +117,28 @@ namespace Avalonia.Controls.Presenters
{
get
{
return Vertical ? new Vector ( 0 , OffsetValue ) : new Vector ( OffsetValue , 0 ) ;
return Vertical ? new Vector ( _ crossAxisOffset , OffsetValue ) : new Vector ( OffsetValue , _ crossAxisOffset ) ;
}
set
{
OffsetValue = Vertical ? value . Y : value . X ;
var oldCrossAxisOffset = _ crossAxisOffset ;
if ( Vertical )
{
OffsetValue = value . Y ;
_ crossAxisOffset = value . X ;
}
else
{
OffsetValue = value . X ;
_ crossAxisOffset = value . Y ;
}
if ( _ crossAxisOffset ! = oldCrossAxisOffset )
{
Owner . InvalidateArrange ( ) ;
}
}
}
@ -143,6 +177,29 @@ namespace Avalonia.Controls.Presenters
return result ;
}
/// <summary>
/// Carries out a measure for the related <see cref="ItemsPresenter"/>.
/// </summary>
/// <param name="availableSize">The size available to the control.</param>
/// <returns>The desired size for the control.</returns>
public virtual Size MeasureOverride ( Size availableSize )
{
Owner . Panel . Measure ( availableSize ) ;
return Owner . Panel . DesiredSize ;
}
/// <summary>
/// Carries out an arrange for the related <see cref="ItemsPresenter"/>.
/// </summary>
/// <param name="finalSize">The size available to the control.</param>
/// <returns>The actual size used.</returns>
public virtual Size ArrangeOverride ( Size finalSize )
{
var origin = Vertical ? new Point ( - _ crossAxisOffset , 0 ) : new Point ( 0 , _ crossAxisOffset ) ;
Owner . Panel . Arrange ( new Rect ( origin , finalSize ) ) ;
return finalSize ;
}
/// <inheritdoc/>
public virtual void UpdateControls ( )
{