Browse Source

Make ScrollViewer handle child margin.

pull/330/head
Steven Kirk 11 years ago
parent
commit
1ac814e534
  1. 63
      src/Perspex.Controls/Presenters/ScrollContentPresenter.cs
  2. 29
      tests/Perspex.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs

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

@ -98,37 +98,50 @@ namespace Perspex.Controls.Presenters
/// <returns>True if the scroll offset was changed; otherwise false.</returns> /// <returns>True if the scroll offset was changed; otherwise false.</returns>
public bool BringDescendentIntoView(IVisual target, Rect targetRect) public bool BringDescendentIntoView(IVisual target, Rect targetRect)
{ {
var transform = target.TransformToVisual(this.GetVisualChildren().Single()); if (Child != null)
var rect = targetRect * transform;
var offset = Offset;
var result = false;
if (rect.Bottom > offset.Y + Viewport.Height)
{ {
offset = offset.WithY(rect.Bottom - Viewport.Height); var transform = target.TransformToVisual(Child);
result = true; var rect = targetRect * transform;
} var offset = Offset;
var result = false;
if (rect.Y < offset.Y) if (rect.Bottom > offset.Y + Viewport.Height)
{ {
offset = offset.WithY(rect.Y); offset = offset.WithY((rect.Bottom - Viewport.Height) + Child.Margin.Top);
result = true; result = true;
} }
if (rect.Right > offset.X + Viewport.Width) if (rect.Y < offset.Y)
{ {
offset = offset.WithX(rect.Right - Viewport.Width); offset = offset.WithY(rect.Y);
result = true; 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); return false;
result = true;
} }
Offset = offset;
return result;
} }
/// <inheritdoc/> /// <inheritdoc/>

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

@ -190,7 +190,7 @@ namespace Perspex.Controls.UnitTests.Presenters
} }
[Fact] [Fact]
public void BringDescendentIntoView_Should_Work() public void BringDescendentIntoView_Should_Update_Offset()
{ {
var target = new ScrollContentPresenter var target = new ScrollContentPresenter
{ {
@ -211,6 +211,33 @@ namespace Perspex.Controls.UnitTests.Presenters
Assert.Equal(new Vector(100, 100), target.Offset); 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 private class TestControl : Control
{ {
protected override Size MeasureOverride(Size availableSize) protected override Size MeasureOverride(Size availableSize)

Loading…
Cancel
Save