diff --git a/samples/XamlTestApplicationPcl/TestScrollable.cs b/samples/XamlTestApplicationPcl/TestScrollable.cs
index cc5552375b..3d48345864 100644
--- a/samples/XamlTestApplicationPcl/TestScrollable.cs
+++ b/samples/XamlTestApplicationPcl/TestScrollable.cs
@@ -37,6 +37,22 @@ namespace XamlTestApplication
get { return _viewport; }
}
+ public Size ScrollSize
+ {
+ get
+ {
+ return new Size(double.PositiveInfinity, 1);
+ }
+ }
+
+ public Size PageScrollSize
+ {
+ get
+ {
+ return new Size(double.PositiveInfinity, Bounds.Height);
+ }
+ }
+
protected override Size MeasureOverride(Size availableSize)
{
using (var line = new FormattedText(
diff --git a/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs b/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
index d9af0b3b6e..1e2550e717 100644
--- a/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
+++ b/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
@@ -220,11 +220,24 @@ namespace Perspex.Controls.Presenters
{
if (Extent.Height > Viewport.Height)
{
- var y = Offset.Y + (-e.Delta.Y * 50);
- y = Math.Max(y, 0);
- y = Math.Min(y, Extent.Height - Viewport.Height);
- Offset = new Vector(Offset.X, y);
- e.Handled = true;
+ var scrollable = Child as IScrollable;
+
+ if (scrollable != null)
+ {
+ var y = Offset.Y + (-e.Delta.Y * scrollable.ScrollSize.Height);
+ y = Math.Max(y, 0);
+ y = Math.Min(y, Extent.Height - Viewport.Height);
+ Offset = new Vector(Offset.X, y);
+ e.Handled = true;
+ }
+ else
+ {
+ var y = Offset.Y + (-e.Delta.Y * 50);
+ y = Math.Max(y, 0);
+ y = Math.Min(y, Extent.Height - Viewport.Height);
+ Offset = new Vector(Offset.X, y);
+ e.Handled = true;
+ }
}
}
diff --git a/src/Perspex.Controls/Primitives/IScrollable.cs b/src/Perspex.Controls/Primitives/IScrollable.cs
index 752c02685d..8cab26c35e 100644
--- a/src/Perspex.Controls/Primitives/IScrollable.cs
+++ b/src/Perspex.Controls/Primitives/IScrollable.cs
@@ -40,5 +40,15 @@ namespace Perspex.Controls.Primitives
/// Gets the size of the viewport, in logical units.
///
Size Viewport { get; }
+
+ ///
+ /// Gets the size to scroll by, in logical units.
+ ///
+ Size ScrollSize { get; }
+
+ ///
+ /// Gets the size to page by, in logical units.
+ ///
+ Size PageScrollSize { get; }
}
}