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>
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;
}
/// <inheritdoc/>

29
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)

Loading…
Cancel
Save