- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 ListBox
中有一个 Visual
集合。我需要找到其中元素的 XPosition
,然后对 ListBox
的 ScrollViewer
的 HorizontalOffset
进行动画处理。本质上我想创建一个动画 ScrollIntoView
方法。
这给我带来了一些问题。首先,如何获得对 ListBox 的滚动查看器的引用?其次,如何获取ListBox
中任意元素的相对XPosition
或HozintalOfffset
?
我不会响应 ListBox
本身的任何输入,因此无法使用 Mouse
相关属性。
最佳答案
我认为您无法使用 WPF Storyboard来制作动画,因为 Storyboard可以对 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 位置。在项目上调用此函数,传入 0,0 作为点,并传入 ScrollViewer。
希望这有帮助。
关于WPF - 动画 ListBox.ScrollViewer.HorizontalOffset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/665719/
我是一名优秀的程序员,十分优秀!