我有一个pivot,其中每个pivotItem包含一个scrollviewer。 我想要做的是每次滚动到新的枢轴项目时将scrollviewer的偏移量设置为特定的数字。我无法创建数据绑定,因为偏移值未公开。
我可以调用ScrollToVerticalOffset(),但我需要先找到当前处于活动状态的scrollviewer并获取该对象,这意味着当前所选枢轴项内的scrollviewer。
我尝试通过基于名称遍历可视树来获取scrollviewer,但我总是得到第一个scrollviewer。
我怎么能这样做?
感谢名单
答案 0 :(得分:3)
您可以按类型而不是按名称遍历可视树,并从选定的PivotItem开始,这应该意味着您找到的第一个ScrollViewer将是您想要的那个。
/// <summary>
/// Gets the visual children of type T.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="target"></param>
/// <returns></returns>
public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject target)
where T : DependencyObject
{
return GetVisualChildren(target).Where(child => child is T).Cast<T>();
}
/// <summary>
/// Get the visual tree children of an element.
/// </summary>
/// <param name="element">The element.</param>
/// <returns>The visual tree children of an element.</returns>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="element"/> is null.
/// </exception>
public static IEnumerable<DependencyObject> GetVisualChildren(this DependencyObject element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
return GetVisualChildrenAndSelfIterator(element).Skip(1);
}
/// <summary>
/// Get the visual tree children of an element and the element itself.
/// </summary>
/// <param name="element">The element.</param>
/// <returns>
/// The visual tree children of an element and the element itself.
/// </returns>
private static IEnumerable<DependencyObject> GetVisualChildrenAndSelfIterator(this DependencyObject element)
{
Debug.Assert(element != null, "element should not be null!");
yield return element;
int count = VisualTreeHelper.GetChildrenCount(element);
for (int i = 0; i < count; i++)
{
yield return VisualTreeHelper.GetChild(element, i);
}
}
所以你最终得到这样的东西:
var scroller = ((PivotItem)pivot.SelectedItem).GetVisualChildren().FirstOrDefault();
scroller.ScrollToVerticalOffset(offset);