TestScrollable.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using Perspex;
  3. using Perspex.Controls;
  4. using Perspex.Controls.Primitives;
  5. using Perspex.Media;
  6. namespace XamlTestApplication
  7. {
  8. public class TestScrollable : Control, IScrollable
  9. {
  10. private int itemCount = 100;
  11. private Size _extent;
  12. private Vector _offset;
  13. private Size _viewport;
  14. private Size _lineSize;
  15. public Action InvalidateScroll { get; set; }
  16. Size IScrollable.Extent
  17. {
  18. get { return _extent; }
  19. }
  20. Vector IScrollable.Offset
  21. {
  22. get { return _offset; }
  23. set
  24. {
  25. _offset = value;
  26. InvalidateVisual();
  27. }
  28. }
  29. Size IScrollable.Viewport
  30. {
  31. get { return _viewport; }
  32. }
  33. public Size ScrollSize
  34. {
  35. get
  36. {
  37. return new Size(double.PositiveInfinity, 1);
  38. }
  39. }
  40. public Size PageScrollSize
  41. {
  42. get
  43. {
  44. return new Size(double.PositiveInfinity, Bounds.Height);
  45. }
  46. }
  47. protected override Size MeasureOverride(Size availableSize)
  48. {
  49. using (var line = new FormattedText(
  50. "Item 100",
  51. TextBlock.GetFontFamily(this),
  52. TextBlock.GetFontSize(this),
  53. TextBlock.GetFontStyle(this),
  54. TextAlignment.Left,
  55. TextBlock.GetFontWeight(this)))
  56. {
  57. line.Constraint = availableSize;
  58. _lineSize = line.Measure();
  59. return new Size(_lineSize.Width, _lineSize.Height * itemCount);
  60. }
  61. }
  62. protected override Size ArrangeOverride(Size finalSize)
  63. {
  64. _viewport = new Size(finalSize.Width, finalSize.Height / _lineSize.Height);
  65. _extent = new Size(_lineSize.Width, itemCount + 1);
  66. InvalidateScroll?.Invoke();
  67. return finalSize;
  68. }
  69. public override void Render(DrawingContext context)
  70. {
  71. var y = 0.0;
  72. for (var i = (int)_offset.Y; i < itemCount; ++i)
  73. {
  74. using (var line = new FormattedText(
  75. "Item " + (i + 1),
  76. TextBlock.GetFontFamily(this),
  77. TextBlock.GetFontSize(this),
  78. TextBlock.GetFontStyle(this),
  79. TextAlignment.Left,
  80. TextBlock.GetFontWeight(this)))
  81. {
  82. context.DrawText(Brushes.Black, new Point(-_offset.X, y), line);
  83. y += _lineSize.Height;
  84. }
  85. }
  86. }
  87. }
  88. }