C# 计算水平偏移以将ListView滚动到SelectedItem的中心
我正在构建一个照片应用程序,使用C# 计算水平偏移以将ListView滚动到SelectedItem的中心,c#,listview,windows-store-apps,windows-8.1,scrollviewer,C#,Listview,Windows Store Apps,Windows 8.1,Scrollviewer,我正在构建一个照片应用程序,使用FlipView和listView作为分页。 当我在列表视图中单击缩略图时,它会在FlipView中显示相同的图片。当我滑动到FlipView时,任何选中的照片都会在列表视图中选择相同的图片。这是通过将以下内容添加到两者中来实现的: 到列表视图: SelectedIndex="{Binding Path=SelectedIndex, ElementName=flipView1, Mode=TwoWay} SelectedIndex="{Binding Path=
FlipView
和listView
作为分页。
当我在列表视图中单击缩略图时,它会在FlipView中显示相同的图片。当我滑动到FlipView
时,任何选中的照片都会在列表视图中选择相同的图片。这是通过将以下内容添加到两者中来实现的:
到列表视图
:
SelectedIndex="{Binding Path=SelectedIndex, ElementName=flipView1, Mode=TwoWay}
SelectedIndex="{Binding Path=SelectedIndex, ElementName=listView1, Mode=TwoWay}
并转到FlipView
:
SelectedIndex="{Binding Path=SelectedIndex, ElementName=flipView1, Mode=TwoWay}
SelectedIndex="{Binding Path=SelectedIndex, ElementName=listView1, Mode=TwoWay}
在我添加的ListView SelectionChanged
事件中:
if (e.AddedItems.Count > 0)
listView1.ScrollIntoView(e.AddedItems.First(), ScrollIntoViewAlignment.Leading);
我唯一的问题是,当我滑动FlipView
时,在ListView
中选择了所需的图片,但是ScrollViewer
没有滚动到它。我尝试使用WinRTXamlToolkit
更改ScrollViewer
的位置:
private void pageRoot_Loaded()
{
// count number of all items
int itemCount = this.listView1.Items.Count;
if (itemCount == 0)
return;
if (listView1.SelectedIndex >= itemCount)
listView1.SelectedIndex = itemCount - 1;
// calculate x-posision of selected item
double listWidth = this.listView1.ActualWidth;
double xPos = (listWidth / itemCount) * listView1.SelectedIndex;
// scroll
var scrollViewer2 = listView1.GetFirstDescendantOfType<ScrollViewer>();
if (scrollViewer2 != null)
scrollViewer2.ChangeView(xPos, 0.0, 1);
}
private void pageRoot_Loaded()
{
//清点所有项目的数量
int itemCount=this.listView1.Items.Count;
如果(itemCount==0)
返回;
如果(listView1.SelectedIndex>=itemCount)
listView1.SelectedIndex=itemCount-1;
//计算所选项目的x位置
double listWidth=this.listView1.ActualWidth;
双xPos=(listWidth/itemCount)*listView1.SelectedIndex;
//卷轴
var scrollViewer2=listView1.getFirstDegenantofType();
如果(scrollViewer2!=null)
scrollViewer2.ChangeView(xPos,0.0,1);
}
第一次listWidth
是1600.0
,然后它一直变为0.0
,这使得xPos=0.0
如何解决此问题?
您应该使用两种“ScrollIntoView”方法之一 ListView.ScrollIntoView()
应该可以工作。调用方法滚动ScrollViewer
时可能会出现问题。我会尝试摆弄ScrollViewer.InvalidateScrollInfo()
,这可能会加快速度。否则-您可以尝试处理ViewChanging/ViewChanged
事件,查看它是否在滚动,并尝试将该信息与ScrollViewServiceChangedEventArgs.IsIndeterminate
一起使用以链接调用
请检查我对这个问题的回答:
aListViewItem
具有BringIntoView
方法BringIntoView
在Windows 8.1中不存在BringIntoViewOnFocusChanged
存在于ScrollViewer
中,但它不能按预期工作!您的列表是垂直滚动还是水平滚动?我将尝试dbl检查,但将我认为在listview1上的视图引入。您的所有项目在listview中的大小是否相同?Mylistview
正在水平滚动,是的,所有项目的大小都相同。我已尝试使用:listView1.UpdateLayout();listView1.ScrollIntoView(listView1.SelectedItem)
但它给了我同样的错误:当我翻动FlipView
许多图像时(每次翻动后不看列表视图),当我看列表视图时,我发现它没有滚动到SelectedIndex
我也使用过:var zoomLoc=new SemanticoomLocation(){Item=listView1.SelectedItem};listView1.MakeVisible(zoomLoc)
我也遇到了同样的错误…听起来很难。根据个人经验,我提到的方法过去对我很有效。试着制作一个简单的应用程序,它只有一个垂直的列表视图和项目,然后在项目加载后使用ScrollIntoView转到第三个项目。如果这样做有效,至少你的路径是好的。然后慢慢添加更多的项目o它喜欢水平滚动,看看它是否仍然有效等等。如果你想让它正常工作,还有另一种方法,如你提到的滚动到X位置,但据我所知,这并不是这种情况下的最佳实践