Анимация кастомного Progressbar'а через c# | Wpf
Цитата: Владимир от 17.12.2021, 21:30Добрый день, я написал кастомный ProgressBar и сделал код для его бесконечной анимации:
[spoiler title="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>[/spoiler]
[spoiler title="С# Код"]
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); } }[/spoiler]
Заранее отвечу на вопрос, почему я не сделал анимацию на xaml, при бесконечной анимации прогресса через xaml, программа начинает передвигаться дёргано 🙁
Проблема этого кода в том что анимация работает странно, допустим, если создать TabControl, в нём 2 TabItem'а, и на один из них поместить ProgressBar, то при переключени по TabItem'ам ProgressBar будет разгоняться, пологаю дело в том что при переключении на другую вкладку происходит выгрузка предыдущей, но код продолжает работать, и при возращении на вкладку с ProgressBar'ом, событие Load происходит ещё раз, запуская ещё одну анимацию.
Также ProgressBar иногда подтупливает(иногда работает медленее, иногда быстрее, иногда на секунду замирает), возможно, это связанно с тем что, пока ProgressBar анимируеться, выпалняються другие задачи, думаю, если сделать c# код асинхронным, анимация работала-бы лучше, но почти в каждой строчке кода есть обращение к контролам, поэтому для меня, как для новичка, не очень понятно как тут реализовать async.
Подскажите пожалуйста, как можно исправить имеющиеся недоработки?)
Добрый день, я написал кастомный ProgressBar и сделал код для его бесконечной анимации:
<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.
Подскажите пожалуйста, как можно исправить имеющиеся недоработки?)
Цитата: Владимир от 24.12.2021, 10:29Нашел как решить проблему с запуском нескольких анимаций на одном прогрессе:
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'а.
Нашел как решить проблему с запуском нескольких анимаций на одном прогрессе:
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'а.