diff --git a/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs b/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
index 5ee9cc160d..76ba8c1545 100644
--- a/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
+++ b/src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
@@ -98,37 +98,50 @@ namespace Perspex.Controls.Presenters
/// True if the scroll offset was changed; otherwise false.
public bool BringDescendentIntoView(IVisual target, Rect targetRect)
{
- var transform = target.TransformToVisual(this.GetVisualChildren().Single());
- var rect = targetRect * transform;
- var offset = Offset;
- var result = false;
-
- if (rect.Bottom > offset.Y + Viewport.Height)
+ if (Child != null)
{
- offset = offset.WithY(rect.Bottom - Viewport.Height);
- result = true;
- }
+ var transform = target.TransformToVisual(Child);
+ var rect = targetRect * transform;
+ var offset = Offset;
+ var result = false;
- if (rect.Y < offset.Y)
- {
- offset = offset.WithY(rect.Y);
- result = true;
- }
+ if (rect.Bottom > offset.Y + Viewport.Height)
+ {
+ offset = offset.WithY((rect.Bottom - Viewport.Height) + Child.Margin.Top);
+ result = true;
+ }
- if (rect.Right > offset.X + Viewport.Width)
- {
- offset = offset.WithX(rect.Right - Viewport.Width);
- result = true;
- }
+ if (rect.Y < offset.Y)
+ {
+ offset = offset.WithY(rect.Y);
+ result = true;
+ }
- if (rect.X < offset.X)
+ if (rect.Right > offset.X + Viewport.Width)
+ {
+ offset = offset.WithX((rect.Right - Viewport.Width) + Child.Margin.Left);
+ result = true;
+ }
+
+ if (rect.X < offset.X)
+ {
+ offset = offset.WithX(rect.X);
+ result = true;
+ }
+
+ if (result)
+ {
+ Offset = offset;
+ }
+
+ System.Diagnostics.Debug.WriteLine($"{targetRect} {offset}");
+
+ return result;
+ }
+ else
{
- offset = offset.WithX(rect.X);
- result = true;
+ return false;
}
-
- Offset = offset;
- return result;
}
///
diff --git a/tests/Perspex.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs b/tests/Perspex.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs
index 9da287f4b9..eb913b3410 100644
--- a/tests/Perspex.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs
+++ b/tests/Perspex.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs
@@ -190,7 +190,7 @@ namespace Perspex.Controls.UnitTests.Presenters
}
[Fact]
- public void BringDescendentIntoView_Should_Work()
+ public void BringDescendentIntoView_Should_Update_Offset()
{
var target = new ScrollContentPresenter
{
@@ -211,6 +211,33 @@ namespace Perspex.Controls.UnitTests.Presenters
Assert.Equal(new Vector(100, 100), target.Offset);
}
+ [Fact]
+ public void BringDescendentIntoView_Should_Handle_Child_Margin()
+ {
+ Border border;
+ var target = new ScrollContentPresenter
+ {
+ Width = 100,
+ Height = 100,
+ Content = new Decorator
+ {
+ Margin = new Thickness(50),
+ Child = border = new Border
+ {
+ Width = 200,
+ Height = 200,
+ }
+ }
+ };
+
+ target.ApplyTemplate();
+ target.Measure(Size.Infinity);
+ target.Arrange(new Rect(0, 0, 100, 100));
+ target.BringDescendentIntoView(border, new Rect(200, 200, 0, 0));
+
+ Assert.Equal(new Vector(150, 150), target.Offset);
+ }
+
private class TestControl : Control
{
protected override Size MeasureOverride(Size availableSize)