XAML ScrollViewer 的子项进入视图事件
XAML ScrollViewer's child bring into view event
我有一个ScrollViewer
,在顶部区域,有一个视频播放器,在媒体播放器下面有一个ListView
。
上下滚动时,当媒体播放器进入视野时,它开始播放。当向下滚动直到媒体播放器消失时,媒体播放器暂停。
那么,怎么做呢?谢谢
我们可以使用ScrollViewer.ViewChanged event to know the user scrolling and zooming the ScrollViewer. But the 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))
{
}
我们应该编写 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);
}
我有一个ScrollViewer
,在顶部区域,有一个视频播放器,在媒体播放器下面有一个ListView
。
上下滚动时,当媒体播放器进入视野时,它开始播放。当向下滚动直到媒体播放器消失时,媒体播放器暂停。
那么,怎么做呢?谢谢
我们可以使用ScrollViewer.ViewChanged event to know the user scrolling and zooming the ScrollViewer. But the 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))
{
}
我们应该编写 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);
}