WP7中代码设置ListBox和LongListSelector条目项的显示位置
2011-12-25 21:52
309 查看
最近开始接触WP7的开发,遇到一个需求,简要的概述如下:
有两个画面,第一个画面中有一个用于输入的TextBox;第二个画面是一个 LongListSelector控件。当第一个画面输入内容后,跳转到第二个画面,如果第二个画面中LongListSelector的数据中有和TextBox输入内容相同的条目,那么选中这个条目,并且使得条目处于屏幕的中间。
对于LongListSelector和ListBox来说,其视图结构中都包含一个ScrollViewer,区别只在于ScrollViewer所处于的层次会有所不同。对于LongListSelector来说,它内在的第一层是一个TemplatedListBox,第二层才是ScrollViewer,而对于ListBox第一层就是ScrollViewer。我解决这个问题的关键就在于找到控件中的ScrollViewer,并使用它的ScrollToVerticalOffset方法。怎么找这个控件呢,办法是调用 VisualTreeHelper.GetChild(DependencyObject reference, int childIndex)方法。可以使用递归来完成这个步骤:
View Code 1 double offset = -2.5;//2.5为修正量
2 bool find = false;
3
4 foreach (CountryCodeInGroup countryCodeInGroup in LongListSelectorSource)
5 {
6 if (find == true) break;
7 if (countryCodeInGroup.Key == inputCountryCode.ID.Substring(0,1).ToLower())
8 {
9 foreach (CountryCode countryCode in countryCodeInGroup)
{
if (countryCode.ID == inputCountryCode.ID)
{
find = true;
break;
}
else
{
offset += 1;
}
}
}
else
{
if (countryCodeInGroup.Count != 0)
{
offset += countryCodeInGroup.Count + 1;
}
}
最后一步:ScrollViewer.ScrollToVerticalOffset(offset);
这个时候可能会考虑一个问题,就是我们在工作日很多时候是在DataTemplate中做些文章,如果我的DataTemplate做的很复杂会影响这个偏移量嘛?答案是不会的,不论是ListBox还是LongListSelector,我们计算的offset实际上都是一个Item的index。
最后说明几点:
1、发现2.5这个修正值似乎在ListBox和LongListSelector都通用,这个值是我肉眼修正的。
2、LongListSelector其实有个 LongListSelector.ScrollTo(object item)方法,但是因为在做的时候没有找到合适的item,理论上将这个item可以是第二段代码中所写的一个CountryCode。3、吐槽一下LongListSelector.GetItemsWithContainers方法。
有两个画面,第一个画面中有一个用于输入的TextBox;第二个画面是一个 LongListSelector控件。当第一个画面输入内容后,跳转到第二个画面,如果第二个画面中LongListSelector的数据中有和TextBox输入内容相同的条目,那么选中这个条目,并且使得条目处于屏幕的中间。
对于LongListSelector和ListBox来说,其视图结构中都包含一个ScrollViewer,区别只在于ScrollViewer所处于的层次会有所不同。对于LongListSelector来说,它内在的第一层是一个TemplatedListBox,第二层才是ScrollViewer,而对于ListBox第一层就是ScrollViewer。我解决这个问题的关键就在于找到控件中的ScrollViewer,并使用它的ScrollToVerticalOffset方法。怎么找这个控件呢,办法是调用 VisualTreeHelper.GetChild(DependencyObject reference, int childIndex)方法。可以使用递归来完成这个步骤:
View Code 1 double offset = -2.5;//2.5为修正量
2 bool find = false;
3
4 foreach (CountryCodeInGroup countryCodeInGroup in LongListSelectorSource)
5 {
6 if (find == true) break;
7 if (countryCodeInGroup.Key == inputCountryCode.ID.Substring(0,1).ToLower())
8 {
9 foreach (CountryCode countryCode in countryCodeInGroup)
{
if (countryCode.ID == inputCountryCode.ID)
{
find = true;
break;
}
else
{
offset += 1;
}
}
}
else
{
if (countryCodeInGroup.Count != 0)
{
offset += countryCodeInGroup.Count + 1;
}
}
最后一步:ScrollViewer.ScrollToVerticalOffset(offset);
这个时候可能会考虑一个问题,就是我们在工作日很多时候是在DataTemplate中做些文章,如果我的DataTemplate做的很复杂会影响这个偏移量嘛?答案是不会的,不论是ListBox还是LongListSelector,我们计算的offset实际上都是一个Item的index。
最后说明几点:
1、发现2.5这个修正值似乎在ListBox和LongListSelector都通用,这个值是我肉眼修正的。
2、LongListSelector其实有个 LongListSelector.ScrollTo(object item)方法,但是因为在做的时候没有找到合适的item,理论上将这个item可以是第二段代码中所写的一个CountryCode。3、吐槽一下LongListSelector.GetItemsWithContainers方法。
相关文章推荐
- IDEA设置文件树位置和代码显示同步
- 设置UIButton的文字显示位置、字体的大小、字体的颜色、加粗(特别是字体颜色设置的那句代码。。挺有用)
- 设置UIButton的文字显示位置、字体的大小、字体的颜色
- 【安卓开发】JAVA代码设置selector不同状态下的背景颜色
- mycelipse 鼠标选中代码 突出显示所有相同代码位置
- C#代码设置窗体和Panel的位置大小
- 如何设置Android studio 3.0显示光标返回上一次浏览位置的箭头图标
- android在代码中怎么使得控件居中,以及代码设置控件selector
- 如何用代码将一个uiview设置到最前面显示 [superview bringSubviewToFront:subview]
- 在代码中动态设置selector
- EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
- 显示设置CMOS RAM时钟(汇编代码)
- js设置文本框中焦点位置在最后的示例代码(简单实用)
- jQuery编辑器KindEditor4.1.4代码高亮显示设置
- Python3 Tkinter基础 Listbox 设置height 更改显示行数的上限
- QTbutton设置背景颜色和文字显示位置设置
- Winform窗体显示在父窗体的中间位置几种代码 (转)
- [置顶] 关于图片与文字在一行显示时,文本的垂直方向位置的设置
- iOS:实现MKAnnotation协议,在地图上设置大头针,点击显示具体的位置信息
- ProgressBar中两种显示图片的设置代码