Browse Source

Make ScrollContentViewer.Offset get coerced.

Use the same logic as for ScrollViewer.
pull/330/head
Steven Kirk 11 years ago
parent
commit
fa872389c3
  1. 9
      src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
  2. 11
      src/Perspex.Controls/ScrollViewer.cs
  3. 13
      tests/Perspex.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs

9
src/Perspex.Controls/Presenters/ScrollContentPresenter.cs

@ -28,6 +28,7 @@ namespace Perspex.Controls.Presenters
static ScrollContentPresenter() static ScrollContentPresenter()
{ {
ClipToBoundsProperty.OverrideDefaultValue(typeof(ScrollContentPresenter), true); ClipToBoundsProperty.OverrideDefaultValue(typeof(ScrollContentPresenter), true);
OffsetProperty.OverrideValidation<ScrollContentPresenter>(ValidateOffset);
AffectsArrange(OffsetProperty); AffectsArrange(OffsetProperty);
} }
@ -143,5 +144,13 @@ namespace Perspex.Controls.Presenters
Offset = offset; Offset = offset;
} }
private static Vector ValidateOffset(ScrollContentPresenter o, Vector value)
{
return ScrollViewer.CoerceOffset(
o.GetValue(ExtentProperty),
o.GetValue(ViewportProperty),
value);
}
} }
} }

11
src/Perspex.Controls/ScrollViewer.cs

@ -124,6 +124,13 @@ namespace Perspex.Controls
set { SetValue(VerticalScrollBarVisibilityProperty, value); } set { SetValue(VerticalScrollBarVisibilityProperty, value); }
} }
internal static Vector CoerceOffset(Size extent, Size viewport, Vector offset)
{
var maxX = Math.Max(extent.Width - viewport.Width, 0);
var maxY = Math.Max(extent.Height - viewport.Height, 0);
return new Vector(Clamp(offset.X, 0, maxX), Clamp(offset.Y, 0, maxY));
}
protected override Size MeasureOverride(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
return base.MeasureOverride(availableSize); return base.MeasureOverride(availableSize);
@ -148,9 +155,7 @@ namespace Perspex.Controls
{ {
var extent = scrollViewer.Extent; var extent = scrollViewer.Extent;
var viewport = scrollViewer.Viewport; var viewport = scrollViewer.Viewport;
var maxX = Math.Max(extent.Width - viewport.Width, 0); return CoerceOffset(extent, viewport, value);
var maxY = Math.Max(extent.Height - viewport.Height, 0);
return new Vector(Clamp(value.X, 0, maxX), Clamp(value.Y, 0, maxY));
} }
else else
{ {

13
tests/Perspex.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs

@ -167,7 +167,7 @@ namespace Perspex.Controls.UnitTests.Presenters
{ {
var target = new ScrollContentPresenter var target = new ScrollContentPresenter
{ {
Content = new Border { Width = 40, Height = 50 } Content = new Border { Width = 140, Height = 150 }
}; };
target.Measure(new Size(100, 100)); target.Measure(new Size(100, 100));
@ -178,6 +178,17 @@ namespace Perspex.Controls.UnitTests.Presenters
Assert.False(target.IsArrangeValid); Assert.False(target.IsArrangeValid);
} }
[Fact]
public void Offset_Should_Be_Coerced_To_Viewport()
{
var target = new ScrollContentPresenter();
target.SetValue(ScrollContentPresenter.ExtentProperty, new Size(20, 20));
target.SetValue(ScrollContentPresenter.ViewportProperty, new Size(10, 10));
target.Offset = new Vector(12, 12);
Assert.Equal(new Vector(10, 10), target.Offset);
}
private class TestControl : Control private class TestControl : Control
{ {
protected override Size MeasureOverride(Size availableSize) protected override Size MeasureOverride(Size availableSize)

Loading…
Cancel
Save