网络知识 娱乐 14.WPF ProgressBar进度条控件

14.WPF ProgressBar进度条控件

摘要


WPF进度条ProgressBar 这个控件,如果直接写到循环里,会死掉,界面会卡死,不会有进度。需要把进度条放到单独的线程中。 传统的需要建立 Thread 或者使用 Timer,分别写在不同的方法中。但现在,使用 Dispatcher.Invoke 调用可以实现这个目的。

正文


脉冲滚动

IsIndeterminate,脉冲滚动

Maximum,Minimum,最大最小

<Grid>n <Grid.RowDefinitions>n <RowDefinition></RowDefinition>n <RowDefinition></RowDefinition>n </Grid.RowDefinitions>n <ProgressBar x:Name="pbar1" Height="10" Margin="20" VerticalAlignment="Top" Minimum="0" Maximum="100" Value="10"n IsIndeterminate="True" Grid.Row="0"n ></ProgressBar>n</Grid>14.WPF ProgressBar进度条控件

一个简单的进度条

<Grid>n <Grid.RowDefinitions>n <RowDefinition Height="auto"></RowDefinition>n <RowDefinition Height="auto"></RowDefinition>n </Grid.RowDefinitions>n <ProgressBar x:Name="pbar" Margin="10" Height="20"></ProgressBar>n <Button x:Name="btnRun" Content="开始" Grid.Row="1" Margin="10" Click="btnRun_Click"></Button>n</Grid>

private void btnRun_Click(object sender, RoutedEventArgs e)n{n this.pbar.Maximum = 10000;n for (int i = 0; i < this.pbar.Maximum; i++)n {n double value = i;n pbar.Dispatcher.Invoke(new Action<System.Windows.DependencyProperty, object>(pbar.SetValue)n , System.Windows.Threading.DispatcherPriority.Background, ProgressBar.ValueProperty, value);n }n}14.WPF ProgressBar进度条控件

使用BackgroundWorker

private void btnRun_Click(object sender, RoutedEventArgs e)n{n BackgroundWorker worker = new BackgroundWorker();n worker.WorkerReportsProgress = true;n worker.DoWork += Worker_DoWork;n worker.ProgressChanged += Worker_ProgressChanged;n worker.RunWorkerAsync();nn}nnprivate void Worker_ProgressChanged(object? sender, ProgressChangedEventArgs e)n{n this.pbar.Value = e.ProgressPercentage;n}nnprivate void Worker_DoWork(object? sender, DoWorkEventArgs e)n{n for (int i = 0; i < 1000; i++)n {n (sender as BackgroundWorker).ReportProgress(i);n Thread.Sleep(100);n }n}

使用Task

private void btnRun_Click(object sender, RoutedEventArgs e)n{n this.pbar.Maximum = 1000;n Task.Factory.StartNew(() => {n for (int i = 0; i < 1000; i++)n {n this.pbar.Dispatcher.BeginInvoke(new Action(() => {n this.pbar.Value = i; n n }));n System.Threading.Thread.Sleep(100);n }n });n}

使用Task+时钟

<Grid>n <Grid.RowDefinitions>n <RowDefinition Height="auto"></RowDefinition>n <RowDefinition Height="auto"></RowDefinition>n <RowDefinition Height="auto"></RowDefinition>n </Grid.RowDefinitions>n <ProgressBar x:Name="pbar" Margin="10" Height="20"></ProgressBar>n <Button x:Name="btnRun" Content="开始" Grid.Row="1" Margin="10" Click="btnRun_Click"></Button>n <Button x:Name="btnStop" Content="停止" Grid.Row="2" Margin="10" Click="btnStop_Click"></Button>n</Grid>

int t = 0;nSystem.Timers.Timer timer=new System.Timers.Timer();nprivate void btnRun_Click(object sender, RoutedEventArgs e)n{n pbar.Maximum = 1000;n timer.Interval = 50;n timer.Elapsed += Timer_Elapsed;n timer.Start();n}nnprivate void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)n{n pbar.Dispatcher.Invoke(new Action(() =>n {n if (t < pbar.Maximum)n {n t++;n pbar.Dispatcher.Invoke(() => {n pbar.Value = t; n });n }n n }));n}nnprivate void btnStop_Click(object sender, RoutedEventArgs e)n{n timer.Stop();n}