WPF进度条动画速度

时间:2011-09-13 02:00:54

标签: wpf progress-bar

我注意到WPF进度条和WinForms进度条完全填充所需的时间不同。

完全填写,就像在Form和WPF中将Value设置为100一样,可以注意到WinForms平滑地填充了条形,而WPF则立即填充它。

我想知道是否有可以在模板中编辑的属性来更改它。

希望我说清楚,如果有人想要,我也可以发布视频。

修改

Here's a video我正在谈论的是什么,注意区别?

编辑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 个答案:

答案 0 :(得分:3)

这个想法是进度条报告实际进度 - 没有时间过去。它不是一个只表示正在发生事情的动画

基本原则是将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 :(得分:1)

请参阅How to update a progress bar so it increases smoothly?

上的答案

它与扩展方法类似,但使用了一种行为,以便您可以将进度条与报告进度的内容分离。 :)

答案 2 :(得分:0)

看起来这是一个问题(或不是)只有WPF进度条......另一个用户报告了它here

  
      
  1. WPF控件,完全是进度条,在何时不会自动更新   复制当我测试复制一个大文件时,只需完整的GUI   完全冻结。进度条运行不顺畅。它只是   从0跳到100。
  2.   

通过添加扩展方法解决了这个问题:

 //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 可以得到准确的结果而不会“跳转”。