WP7 - прокрутка ListBox во внешнем ScrollViewer - PullRequest
4 голосов
/ 06 января 2011

В моем приложении есть следующий макет страницы:

<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.

Я добавляю новый элемент в ObservableCollection, который связан с ListBox, когда пользователь нажимает кнопку на панели приложения.Как я могу вычислить значение, которое будет передано ScrollViewer.ScrollToVerticalOffset?

Спасибо за вашу помощь!

1 Ответ

6 голосов
/ 06 января 2011

Вы можете найти контейнер, сгенерированный 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);

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...