From 8e9cf40ead026aefcdce865b96d9d08723439696 Mon Sep 17 00:00:00 2001 From: danwalmsley Date: Wed, 16 Mar 2016 22:28:56 +0000 Subject: [PATCH] implemented ScrollSize from IScrollable. --- .../XamlTestApplicationPcl/TestScrollable.cs | 16 +++++++++++++ .../Presenters/ScrollContentPresenter.cs | 23 +++++++++++++++---- .../Primitives/IScrollable.cs | 10 ++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) 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; } } }