C# 列表视图在项目源更改时重置其滚动位置

C# 列表视图在项目源更改时重置其滚动位置,c#,xaml,listview,windows-phone-8.1,win-universal-app,C#,Xaml,Listview,Windows Phone 8.1,Win Universal App,我在windows phone 8.1应用程序中遇到一个问题,如果我在listview的itemsource中添加元素,listview将重置其滚动位置 为了解释,如果我滚动到列表视图的底部,并在绑定的OC的顶部插入一个元素,则列表视图会自动跳转到顶部 我希望它保持原样。如何解决这个问题 代码 代码隐藏 公共密封部分类主页面:第页 { 公共ObservableCollection集合=新ObservableCollection(); 私人住宅; 私有整数偏移; 国际努费尔; ScrollView

我在windows phone 8.1应用程序中遇到一个问题,如果我在listview的itemsource中添加元素,listview将重置其滚动位置

为了解释,如果我滚动到列表视图的底部,并在绑定的OC的顶部插入一个元素,则列表视图会自动跳转到顶部

我希望它保持原样。如何解决这个问题

代码

代码隐藏

公共密封部分类主页面:第页
{
公共ObservableCollection集合=新ObservableCollection();
私人住宅;
私有整数偏移;
国际努费尔;
ScrollViewer\u ScrollViewer;
公共主页()
{
this.InitializeComponent();
this.NavigationCacheMode=NavigationCacheMode.Required;
listview.ItemsSource=集合;
地址号(0);
}
公共静态ScrollViewer GetScrollViewer(DependencyObject depObj)
{
如果(depObj是ScrollViewer),则返回depObj作为ScrollViewer;
for(int i=0;i0.9*view.ScrollableHeight)&!incall)
{
incall=true;
addNumber(++偏移量);
}
}
专用void addNumber(整数偏移)
{
int start=偏移量*20;
对于(int i=start;i
用户界面



添加项目是否会导致回发?如果是这样,它将重置滚动位置。为了避免这样做,您需要使用Updatepanel进行AJAX部分回发,以避免回发(确定是否导致完全回发的一个简单方法是控件是否“消失”和“重新出现”),我认为c#/xaml中没有适用于WP8.1的AJAX,我错了,认为所有WIndows 8.1“应用程序”你在哪里修好的?我也有同样的问题。不幸的是没有:(
public sealed partial class MainPage : Page
{
    public ObservableCollection<String> Collection = new ObservableCollection<string>();

    private bool incall;
    private int offset;
    int _noofelements;
    ScrollViewer _scrollViewer;

    public MainPage()
    {
        this.InitializeComponent();

        this.NavigationCacheMode = NavigationCacheMode.Required;
        listview.ItemsSource = Collection;
        addNumber(0);
    }

    public static ScrollViewer GetScrollViewer(DependencyObject depObj)
    {
        if (depObj is ScrollViewer) return depObj as ScrollViewer;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            var child = VisualTreeHelper.GetChild(depObj, i);

            var result = GetScrollViewer(child);
            if (result != null) return result;
        }
        return null;
    }

    private void OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
    {
        ScrollViewer view = (ScrollViewer)sender;
        if ((view.VerticalOffset > 0.9 * view.ScrollableHeight) & !incall)
        {
            incall = true;
            addNumber(++offset);
        }
    }

    private void addNumber(int offset)
    {
        int start = offset * 20;
        for (int i = start; i < start + 20; i++)
        {
            if (i % 20 == 0)
                Collection.Insert(0, (_noofelements++).ToString());
            else
                Collection.Add((_noofelements++).ToString());
        }

        incall = false;
    }

    private void listview_Loaded(object sender, RoutedEventArgs e)
    {
        _scrollViewer = GetScrollViewer(listview);
        if (_scrollViewer != null)
        {
            _scrollViewer.ViewChanged += OnViewChanged;
        }
    }
}
<Grid>
    <ListView x:Name="listview" Loaded="listview_Loaded">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsStackPanel ItemsUpdatingScrollMode="KeepItemsInView"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Margin="25" FontSize="32" Text="{Binding}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>