2

我有一个 StackPanel,其高度基于可用的屏幕高度/分辨率,我需要用数据填充它。棘手的部分是我的数据非常动态,并且具有不同边距的标题/区域,因此执行简单的 show x items 是不可靠的。

有没有办法检测 TextBlock 在 StackPanel 中是否完全可见?如果可能的话,我不想显示一半被切断的项目。

4

1 回答 1

3

所以这比你可能考虑的要复杂。那是因为要确定物品前面是否有东西需要做很多工作。然而,在最简单的情况下,要确定一个项目是否在屏幕上可见,您可以使用此技术。

使用此 XAML:

<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
    <Grid x:Name="MyGrid">
        <StackPanel x:Name="MyStackPanel" Orientation="Horizontal" Background="Gray">
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
            <Rectangle Height="200" Width="200" Margin="50" Fill="Black" />
        </StackPanel>
    </Grid>
</ScrollViewer>

在后面使用此代码:

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    foreach (var item in MyStackPanel.Children.OfType<Windows.UI.Xaml.Shapes.Rectangle>())
    {
        // the box around the child
        var _ItemBounds = item.TransformToVisual(null).TransformBounds(new Rect(0, 0, item.ActualWidth, item.ActualHeight));

        // the box around the screen 
        var _Intersection = Window.Current.Bounds;

        _Intersection.Intersect(_ItemBounds);
        if (_Intersection.Equals(_ItemBounds))
            // full
            item.Fill = new SolidColorBrush(Windows.UI.Colors.Green);
        else if (_Intersection.Equals(Rect.Empty))
            // none
            item.Fill = new SolidColorBrush(Windows.UI.Colors.Red);
        else
            // partial
            item.Fill = new SolidColorBrush(Windows.UI.Colors.Orange);
    }
}

希望这是有道理的。我总是更喜欢解释的例子。运行此程序时,可见框为绿色,部分为橙色,超出范围的项目为红色。很简单。

相关:https ://stackoverflow.com/a/1517794/265706

于 2013-04-22T20:10:39.503 回答