检测TextBlock是否在StackPanel中可见

时间:2013-04-19 18:51:28

标签: c# windows-8 winrt-xaml textblock stackpanel

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

有没有办法检测TextBlock在StackPanel内是否完全可见?如果可能的话,我希望不会显示一半的项目。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

只需将StackPanel的宽度和高度与TextBlock的宽度和高度进行比较。