ContentContainer.WidthSpecification = ScrollingDirection == Direction.Vertical ? LayoutParamPolicies.MatchParent : LayoutParamPolicies.WrapContent;
ContentContainer.HeightSpecification = ScrollingDirection == Direction.Vertical ? LayoutParamPolicies.WrapContent : LayoutParamPolicies.MatchParent;
+ SetScrollbar();
}
}
}
if (isSizeChanged)
{
maxScrollDistance = CalculateMaximumScrollDistance();
- SetScrollbar();
+ if (!ReviseContainerPositionIfNeed())
+ {
+ UpdateScrollbar();
+ }
}
previousContainerSize = ContentContainer.Size;
previousSize = Size;
}
+ private bool ReviseContainerPositionIfNeed()
+ {
+ bool isHorizontal = ScrollingDirection == Direction.Horizontal;
+ float currentPosition = isHorizontal ? ContentContainer.CurrentPosition.X : ContentContainer.CurrentPosition.Y;
+
+ if (Math.Abs(currentPosition) > maxScrollDistance)
+ {
+ StopScroll();
+ var targetPosition = BoundScrollPosition(-maxScrollDistance);
+ if (isHorizontal) ContentContainer.PositionX = targetPosition;
+ else ContentContainer.PositionY = targetPosition;
+ return true;
+ }
+
+ return false;
+ }
+
/// <summary>
/// The composition of a Scrollbar can vary depending on how you use ScrollableBase.
/// Set the composition that will go into the ScrollableBase according to your ScrollableBase.
float contentLength = isHorizontal ? ContentContainer.Size.Width : ContentContainer.Size.Height;
float viewportLength = isHorizontal ? Size.Width : Size.Height;
float currentPosition = isHorizontal ? ContentContainer.CurrentPosition.X : ContentContainer.CurrentPosition.Y;
- Scrollbar.Initialize(contentLength, viewportLength, currentPosition, isHorizontal);
+ Scrollbar.Initialize(contentLength, viewportLength, -currentPosition, isHorizontal);
+ }
+ }
+
+ /// Update scrollbar position and size.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual void UpdateScrollbar()
+ {
+ if (Scrollbar)
+ {
+ bool isHorizontal = ScrollingDirection == Direction.Horizontal;
+ float contentLength = isHorizontal ? ContentContainer.Size.Width : ContentContainer.Size.Height;
+ float viewportLength = isHorizontal ? Size.Width : Size.Height;
+ float currentPosition = isHorizontal ? ContentContainer.CurrentPosition.X : ContentContainer.CurrentPosition.Y;
+ Scrollbar.Update(contentLength, viewportLength, -currentPosition);
}
}