Мы можем использовать событие ScrollViewer.ViewChanged , чтобы узнать, как пользователь прокручивает и масштабирует ScrollViewer . Но ScrollViewer.ViewChanged не повышается при изменении макета.
Таким образом, мы можем использовать событие LayoutUpdated , чтобы сделать это.
Мы можем получить некоторые свойства из ScrollViewer так же, как HorizontalOffset и VerticalOffset.
Мы можем получить координаты верхнего левого угла элемента управления относительно предыдущего элемента управления.
var top = control.TransformToVisual(StackPanel).TransformPoint(new Point());
И тогда мы можем судить, может ли пользователь видеть элемент через пересечение прямоугольников.
var controlBounds = new Rect(top, control.DesiredSize);
var viewBounds = new Rect(new Point(ScrollViewer.HorizontalOffset, ScrollViewer.VerticalOffset), new Size(ScrollViewer.ViewportWidth, ScrollViewer.ViewportHeight));
if (RectIntersects(viewBounds, controlBounds))
{
}
![enter image description here](https://i.stack.imgur.com/WlSgb.png)
Мы должны написать RectIntersects, чтобы два прямоугольника пересекались.
private static bool RectIntersects(Rect a, Rect b)
{
return !(b.Left > a.Right
|| b.Right < a.Left
|| b.Top > a.Bottom
|| b.Bottom < a.Top);
}