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
一起使用以链接调用

请检查我对这个问题的回答:
a
ListViewItem
具有
BringIntoView
方法
BringIntoView
在Windows 8.1中不存在
BringIntoViewOnFocusChanged
存在于
ScrollViewer
中,但它不能按预期工作!您的列表是垂直滚动还是水平滚动?我将尝试dbl检查,但将我认为在listview1上的视图引入。您的所有项目在listview中的大小是否相同?My
listview
正在水平滚动,是的,所有项目的大小都相同。我已尝试使用:
listView1.UpdateLayout();listView1.ScrollIntoView(listView1.SelectedItem)
但它给了我同样的错误:当我翻动
FlipView
许多图像时(每次翻动后不看
列表视图),当我看
列表视图时,我发现它没有滚动到
SelectedIndex
我也使用过:
var zoomLoc=new SemanticoomLocation(){Item=listView1.SelectedItem};listView1.MakeVisible(zoomLoc)
我也遇到了同样的错误…听起来很难。根据个人经验,我提到的方法过去对我很有效。试着制作一个简单的应用程序,它只有一个垂直的列表视图和项目,然后在项目加载后使用ScrollIntoView转到第三个项目。如果这样做有效,至少你的路径是好的。然后慢慢添加更多的项目o它喜欢水平滚动,看看它是否仍然有效等等。如果你想让它正常工作,还有另一种方法,如你提到的滚动到X位置,但据我所知,这并不是这种情况下的最佳实践