简体   繁体   中英

UWP - Listbox scrolls to top after navigating within a frame on the same page

OK, tricky one to explain, but its driving me crazy... Its a UWP App on Windows 10:

I have a main page of which a large part is a Frame (where the main content pages are displayed) on the right is a user control which has a list box in it - when selecting an item in the list it loads the main content page into the frame using a user control event which then calls the Navigate method on the frame - all works fine, except... if you have scrolled down the list then click on an item, the page loads but the listbox scrolls to the top of list - really frustrating!! I can't see why it does this or understand what is going on - can anyone shed some light please?

I know its not reloading the contents and the selecteditem remains selected and does not change.

I'm not familiar with Unity, but after some research in your project, I think that each time you select one Item, you reload all your items in ListBox . For example you can take a look at your UserControl named "PersonPicker":

    private void cbCategory_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (isLoaded)
           people.AddFilterAndOrder("Person Category," + ((ViewModel.SystemConfiguration.SystemData.WorkCategory)cbCategory.SelectedItem).PluralTitle, loadModel: true);
    } 

Then I found your AddFilterAndOrder method in BaseListVM :

    public void AddFilterAndOrder(string filter = "", string order = "", bool loadModel = false)
    {
        if (filter != "")
        {
            string[] items = filter.Split(';');

            foreach (string i in items)
            {
                string[] pair = i.Split(',');

                if (pair[1] == "")
                    filters.Remove(pair[0]);
                else
                    if (filters.Keys.Contains(pair[0]))
                    filters[pair[0]] = pair[1];
                else
                    filters.Add(pair[0], pair[1]);
            }
        }

        if (order != "")
        {
            string[] items = order.Split(';');

            foreach (string i in items)
            {
                string[] pair = i.Split(',');

                if (pair[1] == "")
                    orders.Remove(pair[0]);
                else
                    if (orders.Keys.Contains(pair[0]))
                    orders[pair[0]] = pair[1];
                else
                    orders.Add(pair[0], pair[1]);
            }
        }

        if (loadModel) LoadModel();
    }

Since you passed "loadModel" as true to this method, LoadModel() method will be executed, I won't paste your LoadModel() method here again, but in your LoadModel method, you clear the Items and reload Items again. This is why I said you probably have refreshed your list.

So, maybe you can try:

people.AddFilterAndOrder("Person Category," + ((ViewModel.SystemConfiguration.SystemData.WorkCategory)cbCategory.SelectedItem).PluralTitle, loadModel: false); 

when one Item is selected.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM