我有一个Visual
s 的集合ListBox
.我需要找到XPosition
里面的一个元素,然后动画HorizontalOffset
中的ListBox
的ScrollViewer
.基本上我想创建一个动画ScrollIntoView
方法.
这给了我一些问题.首先,我如何获得对ListBox
s scrollviewer 的引用?其次,我怎样才能获得相对XPosition
或HozintalOfffset
任意元素ListBox
?
我并没有对ListBox
自身的任何输入做出反应,因此我无法使用Mouse
相关属性.
我不认为你能够使用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(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 (child); if (childOfChild != null) return childOfChild; } } return null; }
此函数返回参数类型的第一个可视子元素.打电话FindVisualChild
来获取ScrollViewer.
最后,尝试使用UIElement.TranslatePoint(Point, UIElement)
获取项目的X位置.在项目上调用此函数,为该点传递0,0,并传入ScrollViewer.
希望这可以帮助.