首页 > 其他分享 >关于WPF进度条的使用

关于WPF进度条的使用

时间:2024-03-26 17:36:37浏览次数:24  
标签:... defProcessBar DefProcessBar 进度条 process 窗体 关于 WPF SetProcess

本文讲述如何在软件启动和窗体按钮操作时弹出进度条。

运行环境:Win10、VS2022

一、新建WPF项目。

 

二、新建WPF窗体。

1、新建窗体,取名DefProcessBar.xaml。

 2、设置窗体属性、样式。

<Window x:Class="WpfApp4.DefProcessBar"
        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:WpfApp4"
        mc:Ignorable="d"
        Title="DefProcessBar" Width="300" Height="50"
        WindowStartupLocation="CenterScreen"
        WindowStyle="None" AllowsTransparency="True" Background="Transparent" ShowInTaskbar="False" ResizeMode="NoResize">

2.1、WindowStartupLocation="CenterScreen"是窗体在屏幕中间显示;

2.2、WindowStyle="None"是不要窗体顶部内容;

2.3、AllowsTransparency="True"是允许窗体透明;

2.4、Background="Transparent"是设置透明背景;

2.5、ShowInTaskbar="False"是指示此窗口是否出现在任务栏;

2.6、ResizeMode="NoResize"是不可调节窗体大小。

 

 3、添加进度消息和进度条。

<Grid.RowDefinitions>
    <RowDefinition Height="25"></RowDefinition>
    <RowDefinition Height="25"></RowDefinition>
</Grid.RowDefinitions>

<TextBlock Grid.Row="0" Name="txtTitle" FontSize="16" Foreground="Yellow" HorizontalAlignment="Left" TextWrapping="Wrap" Margin="10, 0,0,0"></TextBlock>
<ProgressBar Grid.Row="1" x:Name="progressBar" Maximum="100" Height="25" Width="300" Foreground="Green" Background="LightGray" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>

 

 4、添加DefProcessBar.xaml.cs代码

/// <summary>
/// DefProcessBar.xaml 的交互逻辑
/// </summary>
public partial class DefProcessBar : Window
{
    public DefProcessBar()
    {
        InitializeComponent();
    }

    public void ShowProcess(int process, string title = "")
    {
        progressBar.Dispatcher.Invoke(() =>
        {
            this.txtTitle.Text = title;
            this.progressBar.Value = process;
        });
    }

    public void SetProcess(DefProcessBar defProcessBar, int process, string title = "")
    {
        if (process > 100)
        {
            process = 100;
        }
        else if (process < 0)
        {
            process = 0;
        }
        title += $" ({process}%)";
        defProcessBar.ShowProcess(process, title);
    }
}

 

三、在App.xaml.cs中使用

/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;

        bool isFinish = false;

        //DialogWait defProcessBar = new DialogWait();
        DefProcessBar defProcessBar = new DefProcessBar();
        Task.Run(() =>
        {
            defProcessBar.SetProcess(defProcessBar, 20, "启动中,请稍后...");
       // 写入实际处理代码 Thread.Sleep(500); defProcessBar.SetProcess(defProcessBar, 40, "启动中,请稍后..."); Thread.Sleep(500); defProcessBar.SetProcess(defProcessBar, 60, "启动中,请稍后..."); Thread.Sleep(500); defProcessBar.SetProcess(defProcessBar, 80, "启动中,请稍后..."); Thread.Sleep(500); defProcessBar.Dispatcher.Invoke(() => { defProcessBar.Close(); }); }); defProcessBar.ShowDialog(); if (isFinish) { base.OnStartup(e); Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose; } else { this.Shutdown(); } } }

 

启动软件查看效果。

 

四、在主窗体MainWindow中弹出进度条。

1、添加按钮。

 2、添加按钮事件处理。

 private void Button_Click(object sender, RoutedEventArgs e)
 {
     DefProcessBar defProcessBar = new DefProcessBar();
     Task.Run(() =>
     {
         defProcessBar.SetProcess(defProcessBar, 20, "启动中,请稍后...");
         Thread.Sleep(500);
         defProcessBar.SetProcess(defProcessBar, 40, "启动中,请稍后...");
         Thread.Sleep(500);
         defProcessBar.SetProcess(defProcessBar, 60, "启动中,请稍后...");
         Thread.Sleep(500);
         defProcessBar.SetProcess(defProcessBar, 80, "启动中,请稍后...");
     //写入实际处理代码 Thread.Sleep(500); defProcessBar.Dispatcher.Invoke(() => { defProcessBar.Close(); }); }); defProcessBar.ShowDialog(); }

3、效果跟软件启动时一样。

 

缺点:所有逻辑必须放到异步处理。

 

标签:...,defProcessBar,DefProcessBar,进度条,process,窗体,关于,WPF,SetProcess
From: https://www.cnblogs.com/resplendent/p/18097027

相关文章

  • 【译】关于涌现能力的常见论点
    原作:JasonWei引言:此博客文章不代表我雇主OpenAI(过去、现在或未来)的立场。我将回顾在讨论大型语言模型的涌现能力时出现的一些常见论点。去年,我们撰写了一篇立场文件,将涌现能力定义为“小语言模型中不存在但在大语言模型中存在的各种能力”。我表明涌现能力非常普遍,并且它们因以......
  • WPF C# create canvas and draw ellipse in canvas
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;......
  • 关于SQL Server数据库中的用户权限和角色管理
    简介在SQLServer数据库系统中,管理用户权限和角色对于确保数据安全、完整性和可访问性至关重要。在本文中,我们将探讨在SQLServer数据库中创建用户、分配权限和管理角色的过程。我们将涵盖基本概念,并提供带有SQL代码片段的实际示例。引言用户管理涉及创建用户帐户、分配适当的......
  • 界面控件DevExpress WinForms/WPF v23.2 - 电子表格支持表单控件
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!表单控件表示交互元素(按钮、复选框和下拉列表),并在......
  • springboot关于bean对象的管理
    Bean的扫描@springbootApplication注释,本质上是一个组合注解,其中组合了@ComponentScan注解,默认只能扫描启动类所在的包以及子包 如果要注册的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的可以用@Bean注释注入三方bean对象publicstatic......
  • 关于我对于计算机专业的思考与展望
    1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机的也可以是其它领域)?我报考的时候是对计算机专业很有兴趣,所以选择了计算机专业,现在没有后悔选择了这个专业,可以通过编程实现很......
  • 手写进度条
     functiongetProcessHtml(beiChuShu,chuShu){varhtml="";html+="<palign='center'style='margin-bottom:-4px;'>"+beiChuShu+"/"+chuShu+"</p>";if(Number(chuShu)!=0){......
  • 关于Spring+的测试
    使用了Spring+的产品,默认需要使用集成测试了。Spring通过SpringTestContextFramework对集成测试提供顶级支持,其不依赖于特定的测试框架。下面示例使用了Spring+中不同产品的测试:1、使用了Spring,参考Spring配置之常用配置概述中关于Profile的部分。对于测试部分具体说明......
  • WPF绑定之道:为何选择属性而非字段,提升灵活性与可控性
     概述:WPF支持绑定到对象的属性而不是字段,主要因为属性提供了更多控制和扩展性。属性包含get和set方法,支持数据验证和通知属性更改,而字段通常被认为是内部实现。使用属性使WPF能够更灵活、可控地与数据交互,提高代码的可读性和可维护性。WPF(WindowsPresentationFoundation)支......
  • 关于数论
    前由于博主比较蒻尚在学习所以先鸽亿会欧拉筛Elaina'scodeintn,phi[N],prime[N],cnt;boolpri[N];voidPhi(){ mst(pri,1); phi[1]=1; for(inti=2;i<=n;i++){ if(pri[i]){ prime[++cnt]=i; phi[i]=i-1; } for(intj=1;j<=cnt;j++){ intk=i*prime[......