WPF Progress Bar Скорость анимации - PullRequest
5 голосов
/ 13 сентября 2011

Я заметил, что есть разница во времени, необходимом для того, чтобы индикатор выполнения WPF и индикатор выполнения WinForms заполнялись полностью.

Заполните полностью, как указано в значении Значение 100 в обеих формах иWPF, можно заметить, что WinForms заполняет панель плавно, тогда как WPF заполняет ее мгновенно.

Я хотел знать, есть ли свойство, которое мы можем редактировать в шаблонах, чтобы изменить это.

Надеюсь, я дал понять, я тоже могу опубликовать видео, если кто-то захочет.

РЕДАКТИРОВАТЬ

Вот видео о чем я говорю, заметьте разницу?

РЕДАКТИРОВАТЬ 2

Заполнение индикатора выполнения таймером?

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
            this.Title = "WPF Progress Bar Demo";
        }

        private void fill(int from, int to)
        {
            Duration duration = new Duration(TimeSpan.FromSeconds(0.5));
            DoubleAnimation doubleanimation = new DoubleAnimation(from, to, duration);
            progb.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
        }

        private void fill_Click(object sender, RoutedEventArgs e)
        {
            fill(0, 100);
        }
    }
}

это нормально, и он будет работать где-нибудь?

Не стесняйтесь менять его.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

Идея состоит в том, что индикатор выполнения сообщает фактический прогресс - не истекшее время. Он не предназначен для анимации, которая просто указывает что-то происходит .

Основной принцип заключается в том, что вы привязываете Value к свойству класса DataContext и обновляете это значение всякий раз, когда происходит этап прогресса.

Вы можете заполнить его с заданной скоростью, используя таймер - вот пример:

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ProgressBar Value="{Binding Path=ProgressValue}"></ProgressBar>
</Grid>

И код:

  public partial class MainWindow : Window, INotifyPropertyChanged
{
    Timer timer;
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        timer = new Timer();
        timer.Interval = 1000;
        timer.Elapsed += new ElapsedEventHandler(t_Elapsed);
        timer.Start();
    }

    void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (this._progressValue < 100)
            this.ProgressValue = _progressValue + 10;
        else
        {
            timer.Stop();
            timer.Dispose();
        }
    }

    private double _progressValue;
    public double ProgressValue
    {
        get { return _progressValue; }
        set
        {
            _progressValue = value;
            RaisePropertyChanged("ProgressValue");
        }
    }

    private void RaisePropertyChanged(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
1 голос
/ 06 января 2014

См. Мой ответ на Как обновить индикатор выполнения, чтобы он плавно увеличивался?

Он похож на метод расширения, но использует поведение, позволяющее отделить индикатор выполнения отвещь, которая сообщает о прогрессе.:)

0 голосов
/ 22 сентября 2011

Похоже, это проблема (или нет) только с индикатором выполнения WPF ... другой пользователь сообщил об этом здесь

  1. WPF Control, точно индикатор выполнения, не обновляется при копировании. Когда я тестирую, чтобы скопировать большой файл, полный графический интерфейс пользователя просто полностью зависает.Индикатор не работает гладко.Он просто переходит с 0 на 100.

Это было решено добавлением метода расширения:

 //Your Code
    pbBar.Value = some_value;
    pbBar.Refresh();
 //Your Code

public static class ExtensionMethods
{
    private static Action EmptyDelegate = delegate() { };
    public static void Refresh(this UIElement uiElement)
    {
        uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
    }

    public static void RefreshInput(this UIElement uiElement)
    {
        uiElement.Dispatcher.Invoke(DispatcherPriority.Input, EmptyDelegate);
    }
}

Вызов метода Refresh () после установки значения решилпроблема.

Но то, что я обнаружил, было даже после применения метода refresh (), индикатор выполнения переключается при каждом запуске (из разных значений).

Использование backgroundworker и reportprogress дает точный результат без "скачков".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...