Подтвердить что ты не робот

WPF Progressbar

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

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

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

Отношения Sangeetha

4b9b3361

Ответ 1

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

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

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

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

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

     progressBar1.Value = DateTime.Now.Second;

В событии Tick нет изменения progressBar1.Value. Таким образом, он показывает, что он перестает двигаться.

Ответ 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

Ответ 3

Используйте DispatcherTimer вместо Timer (объект Forms) и используйте свойство Value для 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).

Ответ 4

Я нашел это (многопоточность WPF: использование BackgroundWorker и представление отчета о прогрессе в интерфейсе пользователя), чтобы содержать отличное решение для моих нужд, хотя с диалоговым окном.

Единственное, что мне показалось очень полезным, это то, что рабочий поток не смог получить доступ к элементам 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;
};