最近开始接触WP7的开发,遇到一个需求,简要的概述如下:

有两个画面,第一个画面中有一个用于输入的TextBox;第二个画面是一个 LongListSelector控件。当第一个画面输入内容后,跳转到第二个画面,如果第二个画面中LongListSelector的数据中有和TextBox输入内容相同的条目,那么选中这个条目,并且使得条目处于屏幕的中间。

 

对于LongListSelector和ListBox来说,其视图结构中都包含一个ScrollViewer,区别只在于ScrollViewer所处于的层次会有所不同。对于LongListSelector来说,它内在的第一层是一个TemplatedListBox,第二层才是ScrollViewer,而对于ListBox第一层就是ScrollViewer。我解决这个问题的关键就在于找到控件中的ScrollViewer,并使用它的ScrollToVerticalOffset方法。怎么找这个控件呢,办法是调用 VisualTreeHelper.GetChild(DependencyObject reference, int childIndex)方法。可以使用递归来完成这个步骤:

 

 1 public static UIElement FindElementRecursive(FrameworkElement parent, Type targetType)
 2         {
 3             int childCount = VisualTreeHelper.GetChildrenCount(parent);
 4             UIElement returnElement = null;
 5             if (childCount > 0)
 6             {
 7                 for (int i = 0; i < childCount; i++)
 8                 {
 9                     Object element = VisualTreeHelper.GetChild(parent, i);
10                     if (element.GetType() == targetType)
11                     {
12                         return element as UIElement;
13                     }
14                     else
15                     {
16                         returnElement = FindElementRecursive(VisualTreeHelper.GetChild(parent, i) as FrameworkElement, targetType);
17                     }
18                 }
19             }
20             return returnElement;
21

相关文章: