WP7 - 在外部ScrollViewer中滚动ListBox

时间:2011-01-06 02:15:25

标签: wpf silverlight windows-phone-7

我的应用程序中有以下页面布局:

<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以上的内容占用了太多空间而没有留下足够的空间来查看{ {1}}内容。

现在,问题是如果我在ListBox的末尾添加一个项目ListBox方法不起作用。所以我需要使用ScrollIntoView的{​​{1}}方法。

当用户点击应用栏上的按钮时,我将新项目添加到绑定到ScrollViewer的{​​{1}}。如何计算要传递给ScrollToVerticalOffset的值?

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

您可以找到ListBox已生成的容器来托管您的元素。拥有此容器后,您可以找到相对于scrollviewer的位置:

  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);

希望有所帮助