我有一个 StackPanel,其高度基于可用的屏幕高度/分辨率,我需要用数据填充它。棘手的部分是我的数据非常动态,并且具有不同边距的标题/区域,因此执行简单的 show x items 是不可靠的。
有没有办法检测 TextBlock 在 StackPanel 中是否完全可见?如果可能的话,我不想显示一半被切断的项目。
我有一个 StackPanel,其高度基于可用的屏幕高度/分辨率,我需要用数据填充它。棘手的部分是我的数据非常动态,并且具有不同边距的标题/区域,因此执行简单的 show x items 是不可靠的。
有没有办法检测 TextBlock 在 StackPanel 中是否完全可见?如果可能的话,我不想显示一半被切断的项目。
所以这比你可能考虑的要复杂。那是因为要确定物品前面是否有东西需要做很多工作。然而,在最简单的情况下,要确定一个项目是否在屏幕上可见,您可以使用此技术。
使用此 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);
}
}
希望这是有道理的。我总是更喜欢解释的例子。运行此程序时,可见框为绿色,部分为橙色,超出范围的项目为红色。很简单。