Вы должны войти, чтобы создавать сообщения и темы.

Анимация кастомного Progressbar'а через c# | Wpf

Добрый день, я написал кастомный ProgressBar и сделал код для его бесконечной анимации:

Xaml код

<UserControl x:Class="Test.TProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Test" x:Name="CustomProgressBar"
mc:Ignorable="d" Loaded="UserControl1_OnLoaded">
<Border Background="Black" CornerRadius="3" Style="{StaticResource BorderClip}">
<Rectangle x:Name="Animation" RadiusX="3" RadiusY="3" Fill="Red"/>
</Border>
</UserControl>

С# Код

async void UserControl1_OnLoaded(object sender, RoutedEventArgs e)
        {
            Animation.Width = CustomProgressBar.Width;
            while (true)
            {
                while (Animation.Margin.Left != Animation.Width)
                {
                    double x = Animation.Margin.Left;
                    Animation.Margin = new Thickness(x += 1, 0, 0, 0);
                    await Task.Delay(1);
                }

                Animation.Margin = new Thickness(-Animation.Width * 2, 0, 0, 0);
            }
        }

Заранее отвечу на вопрос, почему я не сделал анимацию на xaml, при бесконечной анимации прогресса через xaml, программа начинает передвигаться дёргано 🙁

Проблема этого кода в том что анимация работает странно, допустим, если создать TabControl, в нём 2 TabItem'а, и на один из них поместить ProgressBar, то при переключени по TabItem'ам ProgressBar будет разгоняться, пологаю дело в том что при переключении на другую вкладку происходит выгрузка предыдущей, но код продолжает работать, и при возращении на вкладку с ProgressBar'ом, событие Load происходит ещё раз, запуская ещё одну анимацию.

Также ProgressBar иногда подтупливает(иногда работает медленее, иногда быстрее, иногда на секунду замирает), возможно, это связанно с тем что, пока ProgressBar анимируеться, выпалняються другие задачи, думаю, если сделать c# код асинхронным, анимация работала-бы лучше, но почти в каждой строчке кода есть обращение к контролам, поэтому для меня, как для новичка, не очень понятно как тут реализовать async.

Подскажите пожалуйста, как можно исправить имеющиеся недоработки?)

Нашел как решить проблему с запуском нескольких анимаций на одном прогрессе:

bool IsFirst = true;
        async void UserControl1_OnLoaded(object sender, RoutedEventArgs e)
        {
            if (IsFirst)
            {
                IsFirst = false;
                Animation.Width = CustomProgressBar.ActualWidth;
                while (true)
                {
                    while (Animation.Margin.Left != Animation.Width)
                    {
                        double x = Animation.Margin.Left;
                        Animation.Margin = new Thickness(x += 1, 0, 0, 0);
                        await Task.Delay(1);
                    }

                    Animation.Margin = new Thickness(-Animation.Width * 2, 0, 0, 0);
                }
            }
        }

Вродебы этого достаточно для полоноценной работы ProgressBar'а.