ItemVirtualizerSimple.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Linq;
  5. using Avalonia.Controls.Utils;
  6. namespace Avalonia.Controls.Presenters
  7. {
  8. internal class ItemVirtualizerSimple : ItemVirtualizer
  9. {
  10. public ItemVirtualizerSimple(ItemsPresenter owner)
  11. : base(owner)
  12. {
  13. }
  14. public override bool IsLogicalScrollEnabled => true;
  15. public override Size Extent
  16. {
  17. get
  18. {
  19. if (VirtualizingPanel.ScrollDirection == Orientation.Vertical)
  20. {
  21. return new Size(0, Items.Count());
  22. }
  23. else
  24. {
  25. return new Size(Items.Count(), 0);
  26. }
  27. }
  28. }
  29. public override Size Viewport
  30. {
  31. get
  32. {
  33. var panel = VirtualizingPanel;
  34. if (panel.ScrollDirection == Orientation.Vertical)
  35. {
  36. return new Size(0, panel.Children.Count);
  37. }
  38. else
  39. {
  40. return new Size(panel.Children.Count, 0);
  41. }
  42. }
  43. }
  44. public override void Arranging(Size finalSize)
  45. {
  46. CreateRemoveContainers();
  47. }
  48. private void CreateRemoveContainers()
  49. {
  50. var generator = Owner.ItemContainerGenerator;
  51. var panel = VirtualizingPanel;
  52. if (!panel.IsFull)
  53. {
  54. var index = LastIndex + 1;
  55. var items = Items.Cast<object>().Skip(index);
  56. var memberSelector = Owner.MemberSelector;
  57. foreach (var item in items)
  58. {
  59. var materialized = generator.Materialize(index++, item, memberSelector);
  60. panel.Children.Add(materialized.ContainerControl);
  61. if (panel.IsFull)
  62. {
  63. break;
  64. }
  65. }
  66. LastIndex = index - 1;
  67. }
  68. if (panel.OverflowCount > 0)
  69. {
  70. var count = panel.OverflowCount;
  71. var index = panel.Children.Count - count;
  72. panel.Children.RemoveRange(index, count);
  73. generator.Dematerialize(index, count);
  74. LastIndex -= count;
  75. }
  76. }
  77. }
  78. }