WPF - анимация прогресса по времени - PullRequest
2 голосов
/ 25 апреля 2011

Я рассчитываю оживить прогресс, так что цикл занимает 1 минуту.Мой код:

ProgressBar _progressSec = new ProgressBar();
_progressSec.Name = "_progressSec";
_progressSec.Minimum = 0;
_progressSec.Maximum = 60;
_progressSec.Value = DateTime.Now.Second;
this.RegisterName(_progressSec.Name, _progressSec);

NewGrid.Children.Add(_progressSec);

Storyboard newStory = new Storyboard();
DoubleAnimation newAnimation = new DoubleAnimation();
newAnimation.To = 60;
newAnimation.BeginTime = new TimeSpan(DateTime.Now.Second);
newAnimation.RepeatBehavior = RepeatBehavior.Forever;
newAnimation.Duration = new Duration(TimeSpan.FromMinutes(1));
newStory.Children.Add(newAnimation);

Storyboard.SetTarget(newAnimation, _progressSec);
Storyboard.SetTargetProperty(newAnimation, new PropertyPath(ProgressBar.ValueProperty));

newStory.Begin();

Эта полоса занимает ровно 1 минуту, чтобы завершить цикл, что не совсем то, что я хочу.Поэтому, если я начну с 40 секунд, потребуется 60 минут, чтобы достичь 60 секунд.

Я бы хотел начать с текущего значения секунд, увеличивать каждую секунду и когдадостигает 60 секунд, начните снова, поэтому, если он начинается через 40 секунд, потребуется 20 секунд, чтобы достичь минуты.Когда оно дойдет до минуты, я бы хотел, чтобы оно началось снова (с 0).Конечно, я мог бы просто сказать, что разрабатываю часы / таймер, но подумал, что мне лучше объяснить, что происходит, когда я запускаю код.

Когда я добавляю значение From в newAnimation, он всегданачинается с этого значения, а не со значения BeginTime.

Есть идеи?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011

Благодаря svick я разобрался, как это сделать. Решение ниже:

    ProgressBar _progressSec = new ProgressBar();
    DoubleAnimation newAnimation = new DoubleAnimation();
    Storyboard newStory = new Storyboard();

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        _progressSec.Name = "_progressSec";
        _progressSec.Minimum = 0;
        _progressSec.Maximum = 59;
        _progressSec.Value = DateTime.Now.Second;
        this.RegisterName(_progressSec.Name, _progressSec);

        NewGrid.Children.Add(_progressSec);

        int from = DateTime.Now.Second;
        int to = 59;
        newAnimation.From = from;
        newAnimation.To = to;
        newAnimation.Duration = new Duration(TimeSpan.FromSeconds(to - from));

        newStory.Completed += new EventHandler(story_Completed);
        newStory.Children.Add(newAnimation);

        Storyboard.SetTarget(newAnimation, _progressSec);
        Storyboard.SetTargetProperty(newAnimation, new PropertyPath(ProgressBar.ValueProperty));

        newStory.Begin();
    }

    void story_Completed(object sender, EventArgs e)
    {
        int from2 = 0;
        int to2 = 59;
        newAnimation.From = from2;
        newAnimation.To = to2;
        newAnimation.Duration = new Duration(TimeSpan.FromMinutes(1));

        newStory.Children.Add(newAnimation);

        Storyboard.SetTarget(newAnimation, _progressSec);
        Storyboard.SetTargetProperty(newAnimation, new PropertyPath(ProgressBar.ValueProperty));

        newStory.Begin();
    }
0 голосов
/ 25 апреля 2011

Ну, если вы хотите, чтобы ваша анимация занимала какое-то другое время, кроме одной минуты, вы должны указать это так:

int from = 50;
int to = 60;
newAnimation.From = from;
newAnimation.To = to;
newAnimation.Duration = new Duration(TimeSpan.FromSeconds(to - from));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...