2013-03-15 58 views
12

在我的WPF應用程序,我必須表現出與在計時器滴答事件,對此我下面寫一個進度進步,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); 
} 

Load事件如下

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

而在最後在滴答事件中,

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); 
} 

當我執行我的程序進度條顯示兩三個酒吧的進度,然後停止增量。後來根本沒有任何進展。我的代碼出了什麼問題。請幫幫忙!..

問候 桑傑塔

+1

爲什麼使用計時器來啓動動畫?而你正在使用錯誤的計時器。 'System.Windows.Forms.Timer'用於winforms應用程序。改爲使用['DispatcherTimer'](http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatchertimer.aspx)。 – 2013-03-15 10:07:03

回答

9

在我WPF應用我有... System.Windows.Forms.Timer timer;

這是錯誤的類型的定時器。改爲使用DispatcherTimer

當我執行我的計劃進度顯示,二,三棒的進展,然後停止

這讓我吃驚,我怎麼也沒有想到它在所有的工作。 這意味着您也可能有其他問題,例如阻塞主(調度程序)線程。

你只設定值一次,Loaded事件:

 progressBar1.Value = DateTime.Now.Second; 

有一個在Tick事件progressBar1.Value沒有變化。所以它認爲它停止移動。

9

由於您的ProgressBar與任何特定行爲無關,因此它看起來像不確定 bar的作業。

This other SO question提供了一些關於它的見解。總之,這是一個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 
4

使用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中的Maximum屬性定義)。

3

我發現這個(WPF Multithreading: Using the BackgroundWorker and Reporting the Progress to the UI. link)爲我的需求包含一個很好的解決方案,雖然有一個對話框。

我發現非常有用的一件事是,工作線程無法訪問MainWindow的控件(在它自己的方法中),但是當在主窗口事件處理程序中使用委託時,它是可能的。

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; 
};