我认为您不能将 WPF 故事板用于动画,因为故事板会为 WPF 依赖属性设置动画。你需要打电话ScrollViewer.ScrollToHorizontalOffset(double)
来滚动。
您可以尝试在 OnDependencyPropertyChanged() 函数中创建一个调用 SetHorizontalOffset 的自定义依赖项属性。然后你可以为这个属性设置动画。
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 位置。在item上调用这个函数,传入0,0作为point,传入ScrollViewer。
希望这可以帮助。