WPF中实现弹出进度条窗口
实现功能:模拟一个任务开始执行,在窗口弹出一个进度条,展示执行进度,执行完成弹出提示框。例如做数据查询时,如果查询需要一段时间,操作人员可以很好的知道是否查询完成。
1. 设计进度条弹出窗口
进度条窗口样式设计 XAML
<Window x:
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"
Window
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>
进度条窗口后台代码:
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
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设计:
<Window x:
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 3010 30">开始任务...</Button>
</Grid>
</Window>
主窗口后台代码:
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{ /// /// MainWindow.xaml 的交互逻辑 /// 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 { pgbWindow.progressBar1.Value= i; Console.WriteLine(i);<Window x:
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"
Window
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> }); System.Threading.Thread.Sleep(20); } }); MessageBox.Show("任务完成!"); } }}
4. 测试验证如下
来源:https://www.cnblogs.com/flysh/p/18561960
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页:
[1]