Анимированная прокрутка списка
У меня есть вертикальный список WPF, связанный с коллекцией, с пользовательским ItemTemplate. Я заметил несколько вещей:
В отличие от автономного средства просмотра с прокруткой, список не прокручивается непрерывно, а перемещается с шагом, равным высоте элементов. Где в XAML определяется это различие (в конце концов, шаблон списка просто содержит просмотрщик?
Можно ли оживить этот прыжок? Я пытаюсь оживить это так, чтобы оно быстро оживляло переход от одного смещения к другому. Обледенение на торте было бы для анимации, чтобы показать некоторую interia и "колебание" в конце. Я надеялся, что для этого будет заранее определенное поведение, но, похоже, его нет. Попытки сделать это самостоятельно в коде с BeginAnimation потерпели неудачу, и возникло исключение, сообщающее, что свойство VerticalOffset Scrollviewer не может быть анимировано.
Есть какие-нибудь подсказки?
Спасибо том
1 ответ
1- Если вы хотите, чтобы прокрутка не переходила, вы можете изменить ScrollViewer.CanContentScroll на False.
<ListBox ScrollViewer.CanContentScroll="False" .... >.....</ListBox>
2- Вы можете создать свой собственный элемент управления, способный анимировать его смещение.
MyScrollViewer Class
public class MyScrollViewer : ScrollViewer
{
public static readonly DependencyProperty MyOffsetProperty = DependencyProperty.Register(
"MyOffset", typeof(double), typeof(MyScrollViewer),
new PropertyMetadata(new PropertyChangedCallback(onChanged)));
public double MyOffset
{
get { return (double)this.GetValue(ScrollViewer.VerticalOffsetProperty); }
set { this.ScrollToVerticalOffset(value); }
}
private static void onChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((MyScrollViewer)d).MyOffset = (double)e.NewValue;
}
}
в MainWindow.xaml или что-то
<Grid>
<my:MyScrollViewer x:Name="myScroll">
<ListBox x:Name="myList">
</ListBox>
</my:MyScrollViewer>
<Button Content="Down"
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Margin="10"
Click="Button_Click" />
</Grid>
MainWindow.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
for (int i = 1; i < 50; i++)
myList.Items.Add(i);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
double offset = (double)myScroll.GetValue(MyScrollViewer.MyOffsetProperty);
DoubleAnimation goDown = new DoubleAnimation(
offset,
offset + 100,
new Duration(TimeSpan.FromSeconds(2)));
myScroll.BeginAnimation(MyScrollViewer.MyOffsetProperty, goDown);
}
}