WPF中实现弹出进度条窗口
2024-11-22 08:33 Ritchie.Lee 阅读(243) 评论(1) 编辑 收藏 举报实现功能:
模拟一个任务开始执行,在窗口弹出一个进度条,展示执行进度,执行完成弹出提示框。例如做数据查询时,如果查询需要一段时间,操作人员可以很好的知道是否查询完成。
1. 设计进度条弹出窗口
进度条窗口样式设计 XAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | < Window x:Class="WpfApp.ProgressBarWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp" mc:Ignorable="d" WindowStartupLocation="CenterScreen" WindowStyle="None" ResizeMode="NoResize" AllowsTransparency="True" Topmost="True" Title="ProgressBarWindow" Height="100" Width="800"> < Grid > < ProgressBar Margin="5" x:Name="progressBar1" HorizontalAlignment="Stretch" Height="90" VerticalAlignment="Center" DataContext="{Binding}" Value="{Binding Progress}" Foreground="LightGreen" > </ ProgressBar > </ Grid > </ Window > |
进度条窗口后台代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace WpfApp { /// <summary> /// ProgressBarWindow.xaml 的交互逻辑 /// </summary> public partial class ProgressBarWindow : Window { public ProgressBarWindow() { InitializeComponent(); DataContext = new ProgressViewModel( this ); } } } |
2.创建进度条视图模型ProgressViewModel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; namespace WpfApp { public class ProgressViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private Window myWindow; public ProgressViewModel(Window wnd) { myWindow = wnd; } protected virtual void OnPropertyChanged( string propertyName) { PropertyChanged?.Invoke( this , new PropertyChangedEventArgs(propertyName)); } private int _progress; public int Progress { get { return _progress; } set { _progress = value; PropertyChanged?.Invoke( this , new PropertyChangedEventArgs(nameof(Progress))); if (_progress == 100) { // 关闭进度窗口 Application.Current.Dispatcher.Invoke(() => { myWindow.Close(); }); } } } } } |
3. 创建测试主窗口
主窗口XAML设计:
1 2 3 4 5 6 7 8 9 10 11 12 | < Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp" mc:Ignorable="d" Title="MainWindow" Height="250" Width="400"> < Grid > < Button x:Name="btnTest" FontSize="18" Click="btnTest_Click" Margin="10 30 10 30">开始任务...</ Button > </ Grid > </ Window > |
主窗口后台代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private static ProgressBarWindow pgbWindow; private async void btnTest_Click( object sender, RoutedEventArgs e) { // 创建进度窗口 pgbWindow = new ProgressBarWindow(); pgbWindow.Show(); // 模拟耗时任务 await Task.Run(() => { for ( int i = 0; i <= 100; i++) { pgbWindow.Dispatcher.Invoke(() => { pgbWindow.progressBar1.Value= i; Console.WriteLine(i); }); System.Threading.Thread.Sleep(20); } }); MessageBox.Show( "任务完成!" ); } } } |
4. 测试验证如下
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤