wpf - WP7 - 在外部 ScrollViewer 中滚动列表框

标签 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 上面的内容会占用太多空间并且没有留下足够的空间来查看 ListBox 内容。

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

我将新项目添加到当用户单击应用程序栏上的按钮时绑定(bind)到 ListBoxObservableCollection 中。如何计算要传递给 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/

相关文章:

c# - ObservableCollection 和 ListBoxItem DataTemplate 生成问题

html - 将 Silverlight 应用程序迁移到 HTML 5

.NET:在集合上调用 .Add 时出现 ArgumentOutOfRangeException(Pivot 控件出现问题)

c# - 代码隐藏中的翻转 View 动画

c++ - 将 double[,] 转换为 Variant*

WPF 在 CaptureMouse() 之后不发送 MouseMove 事件;

c# - 使 Command 的 CanExecute 依赖于其他字段的值

silverlight - 当前不会命中断点 : No symbols have been loaded for this document

silverlight - 使用 MVVM 和 Silverlight 的 'Wait' 屏幕的一般首选方法

windows-phone-7 - 导航“up”层次结构-地铁方式是什么