Ответ 1
Я не думаю, что вы сможете использовать раскадровку WPF для анимации, потому что раскадровки оживляют свойства зависимостей WPF. Вам потребуется вызвать ScrollViewer.ScrollToHorizontalOffset(double)
для прокрутки.
Вы можете попробовать создать настраиваемое свойство зависимостей, которое вызывает SetHorizontalOffset в функции OnDependencyPropertyChanged(). Тогда вы можете анимировать это свойство.
public static readonly DependencyProperty ScrollOffsetProperty =
DependencyProperty.Register("ScrollOffset", typeof(double), typeof(YOUR_TYPE),
new FrameworkPropertyMetadata(0.0, new PropertyChangedCallback(OnScrollOffsetChanged)));
public double ScrollOffset
{
get { return (double)GetValue(ScrollOffsetProperty); }
set { SetValue(ScrollOffsetProperty, value); }
}
private static void OnScrollOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
YOUR_TYPE myObj = obj as YOUR_TYPE;
if (myObj != null)
myObj.SCROLL_VIEWER.ScrollToHorizontalOffset(myObj.ScrollOffset);
}
Чтобы получить средство просмотра прокрутки, вы можете использовать VisualTreeHelper для поиска визуальных дочерних элементов ListBox. Сохраните ссылку на ScrollViewer, потому что она вам понадобится позже. Попробуйте следующее:
public static childItem FindVisualChild<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
// Iterate through all immediate children
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
Эта функция возвращает первый визуальный дочерний элемент типа параметра. Вызовите FindVisualChild<ScrollViewer>(ListBox)
, чтобы получить ScrollViewer.
Наконец, попробуйте использовать UIElement.TranslatePoint(Point, UIElement)
, чтобы получить позицию X элемента. Вызовите эту функцию на элементе, перейдите в 0,0 для точки и пройдите в ScrollViewer.
Надеюсь, что это поможет.