我有一个基于可用屏幕高度/分辨率的可变高度的StackPanel,我需要用数据填充它。棘手的部分是我的数据非常动态,并且标题/区域具有不同的边距,所以做一个简单的show x项目是不可靠的。
有没有办法检测TextBlock在StackPanel内是否完全可见?如果可能的话,我希望不会显示一半的项目。
答案 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);
}
}
希望这是有道理的。我总是喜欢解释的例子。运行此选项时,可见框显示为绿色,部分显示为橙色,超出范围的项目显示为红色。很简单。
答案 1 :(得分:0)
只需将StackPanel的宽度和高度与TextBlock的宽度和高度进行比较。