Browse Source

add irregular snap points to virtualizing stack panel

pull/9961/head
Emmanuel Hansen 4 years ago
parent
commit
51e9f8b611
  1. 5
      src/Avalonia.Controls/ListBox.cs
  2. 68
      src/Avalonia.Controls/VirtualizingStackPanel.cs

5
src/Avalonia.Controls/ListBox.cs

@ -21,10 +21,7 @@ namespace Avalonia.Controls
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
/// </summary>
private static readonly FuncTemplate<Panel> DefaultPanel =
new FuncTemplate<Panel>(() => new VirtualizingStackPanel()
{
AreVerticalSnapPointsRegular= true,
});
new FuncTemplate<Panel>(() => new VirtualizingStackPanel());
/// <summary>
/// Defines the <see cref="Scroll"/> property.

68
src/Avalonia.Controls/VirtualizingStackPanel.cs

@ -703,21 +703,29 @@ namespace Avalonia.Controls
throw new InvalidOperationException();
if (Orientation == Orientation.Horizontal)
{
foreach (var child in VisualChildren)
var averageElementSize = EstimateElementSizeU();
double snapPoint = 0;
for (var i = 0; i < Items.Count; i++)
{
double snapPoint = 0;
switch (snapPointsAlignment)
var container = ContainerFromIndex(i);
if (container != null)
{
switch (snapPointsAlignment)
{
case SnapPointsAlignment.Near:
snapPoint = container.Bounds.Left;
break;
case SnapPointsAlignment.Center:
snapPoint = container.Bounds.Center.X;
break;
case SnapPointsAlignment.Far:
snapPoint = container.Bounds.Right;
break;
}
}
else
{
case SnapPointsAlignment.Near:
snapPoint = child.Bounds.Left;
break;
case SnapPointsAlignment.Center:
snapPoint = child.Bounds.Center.X;
break;
case SnapPointsAlignment.Far:
snapPoint = child.Bounds.Right;
break;
snapPoint += averageElementSize;
}
snapPoints.Add(snapPoint);
@ -729,21 +737,29 @@ namespace Avalonia.Controls
throw new InvalidOperationException();
if (Orientation == Orientation.Vertical)
{
foreach (var child in VisualChildren)
var averageElementSize = EstimateElementSizeU();
double snapPoint = 0;
for (var i = 0; i < Items.Count; i++)
{
double snapPoint = 0;
switch (snapPointsAlignment)
var container = ContainerFromIndex(i);
if (container != null)
{
switch (snapPointsAlignment)
{
case SnapPointsAlignment.Near:
snapPoint = container.Bounds.Top;
break;
case SnapPointsAlignment.Center:
snapPoint = container.Bounds.Center.Y;
break;
case SnapPointsAlignment.Far:
snapPoint = container.Bounds.Bottom;
break;
}
}
else
{
case SnapPointsAlignment.Near:
snapPoint = child.Bounds.Top;
break;
case SnapPointsAlignment.Center:
snapPoint = child.Bounds.Center.Y;
break;
case SnapPointsAlignment.Far:
snapPoint = child.Bounds.Bottom;
break;
snapPoint += averageElementSize;
}
snapPoints.Add(snapPoint);

Loading…
Cancel
Save