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