我注意到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);
}
}
}
这样可以,它可以在任何地方使用吗?
随意改变它。
感谢。
答案 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
- WPF控件,完全是进度条,在何时不会自动更新 复制当我测试复制一个大文件时,只需完整的GUI 完全冻结。进度条运行不顺畅。它只是 从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 可以得到准确的结果而不会“跳转”。