时光倒影 发表于 2024-11-22 08:15:04

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]
查看完整版本: WPF中实现弹出进度条窗口