WPF进度(WPF Progressbar)

2019-07-21 16:45发布

在我的WPF应用程序,我必须表现出与在计时器滴答事件,对此我下面写一个进度的进展,

System.Windows.Forms.Timer timer;
public MainWindow()
{
    timer = new System.Windows.Forms.Timer();
    timer.Interval = 1000;
    this.timer.Tick += new System.EventHandler(this.timer_Tick);
}

如下面加载事件

private void Window_Loaded(object sender, RoutedEventArgs e)
{
      progressBar1.Minimum = 0;
      progressBar1.Value = DateTime.Now.Second;
      progressBar1.Maximum = 700;
      timer.Start();         
 }

而在最后的Tick事件,

private void timer_Tick(object sender, EventArgs e)
{
    Duration duration = new Duration(TimeSpan.FromSeconds(20));

    //progress bar animation
    System.Windows.Media.Animation.DoubleAnimation doubleanimation = new    System.Windows.Media.Animation.DoubleAnimation(200.0, duration);
    progressBar1.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
}

当我执行我的计划进度显示,二,三棒的进展,然后停止增量。 后来有在进步没有任何影响。 出了什么问题在我的代码。 请帮忙!..

问候桑杰塔

Answer 1:

在我的WPF应用程序我有... System.Windows.Forms.Timer timer;

这是错误的类型的定时器。 使用DispatcherTimer代替。

当我执行我的计划进度显示,二,三棒的进展,然后停止

这让我吃惊,我怎么也没有想到它在所有的工作。 这意味着你可能有oher问题太像阻塞主(调度)线程。

你只设定值一次,在加载的事件:

     progressBar1.Value = DateTime.Now.Second;

还有就是没有变化progressBar1.Value在Tick事件。 所以它的数字,它停止移动。



Answer 2:

由于你的ProgressBar并不涉及任何特定的行为,它看起来像一个不确定栏的工作。

这其他的SO问题提供了一些关于它的洞察力。 总之,这是一个XAML一行代码:

<!-- MinVal, MaxVal, Height needed for this to work -->
<ProgressBar x:Name="progressBar1" Margin="5" IsIndeterminate="True" 
    MinimumValue="0" MaximumValue="700" value="0" Height="20"/> 

然后在代码中,你是这样的:

progressBar1.IsIndeterminate = true; // start animation
progressBar1.IsIndeterminate = false; // stop animation


Answer 3:

使用DispatcherTimer代替定时器(窗体对象),以及进度条的使用Value属性。

试试这个 :

MainWindows.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="55" Width="261">
    <Grid>
        <ProgressBar Name="pb" Maximum="60" />
    </Grid>
</Window>

MainWindows.xaml.cs:

using System.Windows;
using System.Windows.Threading;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private DispatcherTimer timer;

        public MainWindow()
        {
            InitializeComponent();

            this.timer = new DispatcherTimer();
            this.timer.Tick += timer_Tick;
            this.timer.Interval = new System.TimeSpan(0, 0, 1);
            this.timer.Start();
        }

        private void timer_Tick(object sender, System.EventArgs e)
        {
            this.pb.Value = System.DateTime.Now.Second % 100;
        }
    }
}

您可以通过更改Value属性(别忘了最大属性定义在XAML)更改进度条的行为。



Answer 4:

我发现这个( WPF多线程:使用BackgroundWorker和报告的UI链接进展。 )包含我需要一个很好的解决方案,尽管有一个对话框。

有一两件事,我发现非常有用的是,使用主窗口的事件处理程序,有可能里面的委托时,工作线程无法访问主窗口的控制(在它自己的方法),但是。

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    pd.Close();
    // Get a result from the asynchronous worker
    T t = (t)args.Result
    this.ExampleControl.Text = t.BlaBla;
};


文章来源: WPF Progressbar