0

我在 xaml 页面中有这样的内容:

<ScrollViewer x:Name="PreviewvideosScrollViewer" HorizontalScrollBarVisibility="Auto" Width="1366" Height="480" VerticalScrollBarVisibility="Disabled">
            <Canvas x:Name="VideoCanvas" HorizontalAlignment="Left">
            </Canvas>
</ScrollViewer>

在代码中,我向画布添加了许多控件,其中许多控件不在窗口中。如何确定哪些控件可见(用户在屏幕中看到),哪些不可见?

我试过这样的示例代码:

private bool IsUserVisible(FrameworkElement element)
    {
        if (!element.Parent.Equals(VideoCanvas))
            return true;
        //// position of your visual inside the scrollviewer    
        GeneralTransform childTransform = element.TransformToAncestor(VideoCanvas);
        Rect rectangle = childTransform.TransformBounds(new Rect(new Point(0, 0), element.RenderSize));

        ////Check if the elements Rect intersects with that of the scrollviewer's
        Rect result = Rect.Intersect(new Rect(new Point(0, 0), VideoCanvas.RenderSize), rectangle);
        ////if result is Empty then the element is not in view
        return result != Rect.Empty;
    }

或这个:

private bool IsUserVisible(FrameworkElement element, FrameworkElement container)
    {
        if (!element.IsVisible)
            return false;

        var bounds = element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight));
        var rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight);
        return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight);
    }

但两者都不起作用。哪里可能有问题?在滚动查看器中使用画布?或者是其他东西?谢谢

4

1 回答 1

2

好吧,假设您在 Canvas 中有控制权。

您想获取其相对于 ScrollViewer 的坐标,然后您想检查坐标是否介于 0 和 ScrollViewer.ViewportWidth 和 ScrollViewer.ViewportHeight 之间。

如何将 Canvas 坐标转换为 ScrollViewer 坐标?

首先,我们不考虑滚动,假设 Canvas 比 ScrollViewer 小,它的 Horizo​​ntalAlignment 设置为 Left,VerticalAlignment 设置为 Top。

要获得相对于 ScrollViewer 的 Controls 坐标,使用它很简单:

var x = Canvas.GetLeft(YourControl);

var y = Canvas.GetTop(YourControl);

现在假设我们也应用了滚动。

var x = Canvas.GetLeft(YourControl) - ScrollViewer.HorizontalOffset;

var y = Canvas.GetTop(YourControl) - ScrollViewer.VerticalOffset;

if(x >= 0 && x <= ScrollViewer.ViewportWidth && y <= ScrollViewer.ViewportHeight)
  return true; // YAY

有道理,不是吗?

于 2013-04-04T17:26:13.960 回答