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)