我的应用程序中有以下页面布局:
<Grid x:Name="ContentPanel"
Grid.Row="1">
<ScrollViewer x:Name="ScrollViewer1"
MaxHeight="600"
VerticalAlignment="Top"
HorizontalAlignment="Stretch">
<StackPanel x:Name="StackPanel1" >
<TextBlock x:Name="TextBlock1" />
<toolkit:ListPicker x:Name="ListPicker1" />
<TextBlock x:Name="TextBlock2" />
<TextBox x:Name="TextBlock3" />
<TextBlock x:Name="TextBlock4" />
<StackPanel x:Name="StackPanel2" >
<TextBlock x:Name="TextBlock5" />
<Image x:Name="Image1"/>
</StackPanel>
<ListBox x:Name="ListBox1">
<!--Customize the ListBox template to remove the built-in ScrollViewer-->
<ListBox.Template>
<ControlTemplate>
<ItemsPresenter />
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemTemplate>
<DataTemplate>
<!-- .... -->
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment"
Value="Stretch" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</StackPanel>
</ScrollViewer>
</Grid>
我添加了一个外部 ScrollViewer
而不是使用 ListBox
,因为没有它,ListBox
上面的内容会占用太多空间并且没有留下足够的空间来查看 ListBox
内容。
现在,问题是如果我将一个项目添加到 ListBox
的末尾,则 ScrollIntoView
方法不起作用。所以我需要使用 ScrollViewer
的 ScrollToVerticalOffset
方法。
我将新项目添加到当用户单击应用程序栏上的按钮时绑定(bind)到 ListBox
的 ObservableCollection
中。如何计算要传递给 ScrollViewer.ScrollToVerticalOffset
的值?
感谢您的帮助!
最佳答案
您可以找到 ListBox 生成的用于托管您的元素的容器。一旦有了这个容器,您就可以找到它相对于滚动查看器的位置:
var newItem = // the item you just added to your listbox
// find the ListBox container
listBox.UpdateLayout()
var element = listBox.ItemContainerGenerator.ContainerFromItem(newItem) as FrameworkElement;
// find its position in the scroll viewer
var transform = element.TransformToVisual(ScrollViewer);
var elementLocation = transform.Transform(new Point(0, 0));
double newVerticalOffset = elementLocation.Y + ScrollViewer.VerticalOffset;
// scroll into view
ScrollViewer.ScrollToVerticalOffset(newVerticalOffset);
希望有帮助
关于wpf - WP7 - 在外部 ScrollViewer 中滚动列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4611185/