Подвисает анимация на Windows 10

Есть приложение в котором используется лоадер. В лоадере есть анимация вращения, а сам лоадер появляется и пропадает используя анимацию свойства Opacity с установкой соответсвующего значения для Visibility. Пример с лоадером есть на GitHub. Само приложение представляет собой вьюшку с панелью навигации и объектом Frame, куда грузятся Page с соответствующим контентом. При первом запросе на отображение, в соотвествующей ViewModel происходит загрузка и приображение данных. В этот момент показывается лоадер. Данные загружаются через async/await методы, используется .net 4.7.2.

Проблема заключается в следующем: на некоторых машинах с Windows 10 анимация вращения лоадера и анимация Opacity происходит рывками (как будто UI поток обрабатывает длительную задачу), UI при этом остается отзывчивым (можно перейти на другую вкладку, изменить размер окна и прочее). На машинах с Windows 7 таких проблем не замечено, часть машин с Windows 10 также отрабатывают анимацию корректно.

Пробовал запускать тестовый проект (ссылка выше) на машинах, где есть проблема с анимацией - в тестовом проекте проблем нет. Т.е. можно предположить, что в приложении что-то грузит UI поток. Как это можно отладить и исправить?

Путем исключения установил, что приводит к подвисанию анимации. Приложение сделано адаптивным под разную ширину окна. Сделано это сменой ContentTemplate. Буду думать как это исправить.

 <ListBox.ItemTemplate>
     <DataTemplate>
         <ContentControl Content="{Binding}">
             <ContentControl.Style>
                 <Style TargetType="{x:Type ContentControl}">
                     <Setter Property="ContentTemplate" Value="{StaticResource fourColumnsTemplate}" />
                     <Style.Triggers>
                         <DataTrigger Binding="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor,
                                    AncestorType={x:Type ListBox}}, Converter={local:AllFundsItemTemplateSelectorConverter}}"
                                                 Value="oneColumn">
                             <Setter Property="ContentTemplate" Value="{StaticResource oneColumnTemplate}" />
                                    </DataTrigger>

                                    <DataTrigger Binding="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor,
                                    AncestorType={x:Type ListBox}}, Converter={local:AllFundsItemTemplateSelectorConverter}}"
                                                 Value="twoColumns">
                             <Setter Property="ContentTemplate" Value="{StaticResource twoColumnsTemplate}" />
                                    </DataTrigger>
                         </Style.Triggers>
                     </Style>
                 </ContentControl.Style>
             </ContentControl>
         </DataTemplate>
     </ListBox.ItemTemplate>

UPDATE!!! В общем проблема в другом: при загрузке страницы UI поток полностью загружен компоновкой, в итоге анимация лоадера ждет, когда UI осовободится. Будет решено изменением процесса загрузки.


Ответы (1 шт):

Автор решения: Виталий Ефимов

В общем проблема анимации в том, что UI поток занят созданием контролов для отображения загруженных данных. Была идея раздробить одну большую задачу создания контролов на несколько мелких, но данный подход не сработал и код при этом стал сложный для понимания. Решение может быть получено, если создать отдельный UI поток для отображения лоадера. Как это сделать описано тут и тут.

→ Ссылка