2013-03-15 2 views
12

В моем WPF приложения я должен показать прогресс ProgressBar с в случае клещевого таймер, который я пишу, как показано ниже, событиеWPF Progressbar

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

И последний в галочке,

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

Когда я запускаю свою панель прогресса программы, отображается прогресс для двух-трех баров, а затем она останавливается приращением , Позже это не влияет на прогресс. Что пошло не так в моем коде. Пожалуйста, помогите! ..

С уважением Sangeetha

+1

Почему вы используете таймер для запуска анимации? И вы используете неправильный таймер. 'System.Windows.Forms.Timer' предназначен для приложений winforms. Вместо этого используйте ['DispatcherTimer'] (http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx). –

ответ

9

В моем WPF приложения у меня есть ... System.Windows.Forms.Timer timer;

То есть неправильный тип таймера. Вместо этого используйте DispatcherTimer.

Когда я исполняю свою программу ProgressBar показывает прогресс в течение двух-трех стержней, а затем он останавливается

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

Вы только установив значение один раз, в нагруженном событии:

 progressBar1.Value = DateTime.Now.Second; 

Там нет никаких изменений в progressBar1.Value в случае клеща. Поэтому он показывает, что он перестает двигаться.

9

Поскольку ваш ProgressBar не имеет отношения к какому-либо конкретному поведению, он выглядит как работа для неопределенного бар.

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 вместо таймера (объект формы), а также использование значения свойства ProgressBar.

Попробуйте это:

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 (не забудьте указать свойство Maximum в xaml).

3

Я нашел это (WPF Multithreading: Using the BackgroundWorker and Reporting the Progress to the UI. link), чтобы содержать отличное решение для моих нужд, хотя и с диалоговым окном.

Единственное, что мне показалось очень полезным, это то, что рабочий поток не смог получить доступ к элементам MainWindow (в собственном методе), однако при использовании делегата внутри главного обработчика событий Windows это было возможно.

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; 
}; 
Смежные вопросы