XAML ScrollViewer - дочерний элемент, отображающий событие - PullRequest
1 голос
/ 26 апреля 2019

У меня есть ScrollViewer, в верхней части есть видеоплеер, и ListView под медиаплеером.

При прокрутке вверх и вниз, когда отображается мультимедийный проигрыватель, он начинает воспроизводиться.При прокрутке вниз до исчезновения мультимедийного проигрывателя мультимедийный проигрыватель приостанавливается.

Итак, как это сделать?Thx.

1 Ответ

2 голосов
/ 29 апреля 2019

Мы можем использовать событие 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

Мы должны написать 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);
    }
...