Windows UWP C#, изображения неправильно отображаются в панели стека

Итак, у меня есть функция, которая загружает список идентификаторов изображений, затем у меня есть цикл, который добавляет progressRing для каждого идентификатора и устанавливает имя кольца прогресса для идентификатора. Затем у меня есть эта функция, чтобы заменить кольцо прогресса, если загрузка завершена.

public async void getImagesLoop()
    {
        while (loop == true)
        {
            loop = false;
            foreach (UIElement child in stackpanel.Children)
            {
                if (child is ProgressRing)
                {
                    var ring = (ProgressRing)child;

                    if (await ApplicationData.Current.LocalFolder.TryGetItemAsync("image_" + ring.Name + ".jpg") != null)
                    {
                       var tmp = new Image();
                        tmp.Margin = new Thickness(0, 0, 0, 50);
                        tmp.Margin = new Thickness(0, 50, 0, 50);
                        tmp.Name = ring.Name;
                        tmp.DoubleTapped += Tmp_DoubleTapped;
                        tmp.Source = new BitmapImage(new Uri("ms-appdata:///local/image_" + ring.Name + ".jpg", UriKind.Absolute));

                        var location = stackpanel.Children.IndexOf(child);

                        Debug.WriteLine("Replacing " + location);

                        stackpanel.Children.RemoveAt(location);
                        stackpanel.Children.Insert(location, tmp);

                        Debug.WriteLine("Done replacing");
                    }
                    else
                    {
                       loop = true;
                    }

                }
            }
        }
    }

Тем не менее, он пропускает первое изображение. (image_2.jpg, image_3.jpg), поэтому image_1.jpg отсутствует.

Вот и отладка:

Replacing 1
Done replacing
Done
Replacing 0
Done replacing
Done
Replacing 2
Done replacing
Done

Я вызываю цикл следующим образом:

loop = true;
getImagesLoop();

Кроме того, я не думаю, что это очень оптимизировано, так что бы оптимизировать его, чтобы не было утечек памяти?

ОБНОВЛЕНИЕ 1:

Итак, я запустил его снова, и теперь есть первое и третье изображение, а не второе изображение. Отлаживать:

Replacing 0
Done replacing
Done
Replacing 1
Done replacing
Done
Replacing 2
Done replacing
Done

Я предполагаю, что это заказная штука, кажется, что второй, которого заменили, в конечном итоге пропал.


person Cody Robinson    schedule 14.12.2015    source источник
comment
Непонятно, что вы имеете в виду, когда говорите, что в конечном итоге пропускаете первое изображение - разве Replacing 0 не означает, что оно действительно обработало первое изображение? Возможно, вам потребуется уточнить связь между вашими индексами и именами файлов изображений.   -  person Simon MᶜKenzie    schedule 14.12.2015
comment
@SimonMᶜKenzie У меня есть 3 изображения (image_1.jpg, (image_2.jpg, image_3.jpg). В приложении отображаются только изображения 2 и изображения 3, пока я не нажму кнопку обновления, которая очищает все элементы в панели стека и запускает процесс заново. У меня есть локальный кеш, и если он найден в кеше, он использует его вместо загрузки, поэтому что-то не так с кодом, из-за которого по какой-то причине не отображается первое изображение.   -  person Cody Robinson    schedule 14.12.2015
comment
Как правило, вы не должны удалять ничего из списка во время обработки foreach. Потому что, если для загрузки изображения требуется больше времени, у вас проблема со значениями.   -  person Juan Pablo Garcia Coello    schedule 14.12.2015
comment
Похоже, вы должны создать элемент управления, который обертывает нужные вам функции, и использовать ItemsControl для привязки к списку вместо того, чтобы напрямую манипулировать StackPanel. Тогда каждое изображение/прогресс может иметь свое собственное состояние.   -  person WiredPrairie    schedule 14.12.2015
comment
@Juan Pablo Garcia Coello Итак, вместо того, чтобы использовать для каждого, просто используйте вместо этого цикл, который считается?   -  person Cody Robinson    schedule 14.12.2015
comment
@WiredPrairie Я не совсем то, что ты имеешь в виду. Я предполагаю сделать класс?   -  person Cody Robinson    schedule 14.12.2015


Ответы (1)


Поэтому я вынул цикл while и добавил, изменил его на это:

        foreach (UIElement child in stackpanel.Children)
        {
            if (child is ProgressRing)
            {
                var ring = (ProgressRing)child;

                if (await image_folder.TryGetItemAsync("image_" + ring.Name + ".jpg") != null)
                {
                   var tmp = new Image();
                    tmp.Margin = new Thickness(0, 0, 0, 50);
                    tmp.Margin = new Thickness(0, 50, 0, 50);
                    tmp.Name = ring.Name;
                    tmp.DoubleTapped += Tmp_DoubleTapped;
                    tmp.Source = new BitmapImage(new Uri("ms-appdata:///local/images/image_" + ring.Name + ".jpg", UriKind.Absolute));
                    var location = stackpanel.Children.IndexOf(child);

                    if (location < 0)
                    {
                    return;
                    }

                    Debug.WriteLine("Replacing " + location);

                    stackpanel.Children.Remove(child);

                    stackpanel.Children.Insert(location, tmp);

                    Debug.WriteLine("Done replacing");
                }
            }
        }

и после загрузки каждого изображения я просто вызывал функцию.

person Cody Robinson    schedule 15.12.2015