Подвисает анимация на 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 поток для отображения лоадера. Как это сделать описано тут и тут.