WPF/C#:ProgressBar的基本使用

前言

在日常开发过程中,如果遇到需要一段时间才能完成的任务,通常需要给用户一个进度条提示。今天给大家介绍的是WPF/C#中ProgressBar的基本使用。

ProgressBar的介绍

在WPF(Windows Presentation Foundation)中,ProgressBar是一个用户界面元素,用于显示一个操作的进度。

ProgressBar有两种模式:确定模式和不确定模式。

  1. 确定模式:在确定模式下,ProgressBar显示一个操作的完成百分比。你可以通过设置ProgressBarMinimumMaximumValue属性来控制进度条的显示。例如,如果你设置Minimum为0,Maximum为100,然后将Value设置为50,那么ProgressBar将显示为一半填充(表示操作完成了50%)。
  2. 不确定模式:在不确定模式下,ProgressBar显示一个持续的动画,表示一个操作正在进行,但是没有指定完成百分比。你可以通过设置ProgressBarIsIndeterminate属性为true来启用不确定模式。

不确定模式的使用

xaml:

<StackPanel>
    <Button Content="执行耗时任务" Margin="20"
            Click="Button_Click"></Button>
    <ProgressBar Margin="50" x:Name="progressBar1" Width="300" Height="20" 
           IsIndeterminate="True" Visibility="Hidden" />
</StackPanel>

cs:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    progressBar1.Visibility = Visibility.Visible;
    await Task.Delay(5000);
    progressBar1.Visibility = Visibility.Hidden;
}

假设在执行一个耗时任务,可以先将ProgressBarIsIndeterminate属性设置为True,表示使用不确定模式,也就是进度条一直在动,然后设置Visibility属性为Hidden,使ProgressBar刚开始不可见。在执行任务前,让它可见,再任务完成后,再让它不可见。

实现的效果如下图所示:

不确定模式的使用效果

确定模式的使用

xaml:

 <StackPanel>
     <Button Content="执行耗时任务" Margin="20"
             Click="Button_Click"></Button>
     <ProgressBar Margin="50" x:Name="progressBar1" Width="300" Height="20" 
            Minimum="0" Maximum="100" Visibility="Hidden" />
 </StackPanel>

cs:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    progressBar1.Visibility = Visibility.Visible;
    for (int i = 0; i <= 100; i++)
    {
        int progress = i;
        await Task.Delay(50);  // 等待50毫秒
        Dispatcher.Invoke(() => progressBar1.Value = progress);  // 更新ProgressBar的值
    }
    progressBar1.Visibility = Visibility.Hidden;
}

使用

Dispatcher.Invoke(() => progressBar1.Value = progress);

是因为在WPF中,只有创建控件的线程(通常是主UI线程)才能访问该控件。这被称为线程关联或线程亲和性。如果你尝试从另一个线程访问控件,例如从异步任务中更新控件的属性,你将会收到一个异常。

Dispatcher.Invoke方法允许你在创建控件的线程上执行特定的操作。Dispatcher.Invoke(() => MyProgressBar.Value = progress);这行代码将更新ProgressBarValue属性的操作发送到主UI线程上执行。这样,即使这个操作是从异步任务中调用的,也不会收到线程亲和性的异常。

总的来说,每当你需要从非UI线程更新UI控件时,你都需要使用Dispatcher.Invoke或类似的方法来确保操作在正确的线程上执行。

实现效果如下所示:

确定模式的使用效果

HandyControl中的ProgressBar的使用

HandyControl是一个基于WPF(Windows Presentation Foundation)的开源UI库,它提供了一套丰富、灵活且实用的控件集,可以帮助开发者更容易地创建美观且功能强大的桌面应用程序。

HandyControl中ProgressBar的使用效果如下所示:

使用效果

跟自带的用法差不多,现在从三个类别中分别选一种做示例。

不确定模式的用法

对应图中的第二种类别。

xaml:

<StackPanel>
    <Button Content="执行耗时任务" Margin="20"
            Click="Button_Click"></Button>
    <hc:CircleProgressBar x:Name="progressBar1" IsIndeterminate="True" 
                          Margin="20" Width="100" Height="100"
                          ArcThickness="6"  Visibility="Hidden"
                          Style="{StaticResource ProgressBarInfoCircle}"/>
</StackPanel>

cs:

 private async void Button_Click(object sender, RoutedEventArgs e)
 {      
     progressBar1.Visibility = Visibility.Visible;
     await Task.Delay(5000);         
     progressBar1.Visibility = Visibility.Hidden;
 }

实现效果如下所示:

效果

确定模式的用法

图中第一种。

xaml:

<StackPanel>
    <Button Content="执行耗时任务" Margin="20"
            Click="Button_Click"></Button>    
    <hc:CircleProgressBar x:Name="progressBar1" Visibility="Hidden"
                          Margin="20" ShowText="True" Width="80" Height="80" ArcThickness="5" 
                          Style="{StaticResource ProgressBarSuccessCircle}"/>
</StackPanel>

cs:

 private async void Button_Click(object sender, RoutedEventArgs e)
 {      
     progressBar1.Visibility = Visibility.Visible;
     for (int i = 0; i <= 100; i++)
     {
         int progress = i;
         await Task.Delay(50);  // 等待50毫秒
         Dispatcher.Invoke(() => progressBar1.Value = progress);  // 更新ProgressBar的值               
     }
     progressBar1.Visibility = Visibility.Hidden;
 }

实现效果:

效果

图中第三种。

xaml:

<StackPanel>
    <Button Content="执行耗时任务" Margin="20"
            Click="Button_Click"></Button>   
    <hc:WaveProgressBar x:Name="progressBar1" />
</StackPanel>

cs:

private async void Button_Click(object sender, RoutedEventArgs e)
{      
    progressBar1.Visibility = Visibility.Visible;
    for (int i = 0; i <= 100; i++)
    {
        int progress = i;
        await Task.Delay(50);  // 等待50毫秒
        Dispatcher.Invoke(() => progressBar1.Value = progress);  // 更新ProgressBar的值               
    }
    progressBar1.Visibility = Visibility.Hidden;
}

实现效果:

效果

总结

本文介绍了WPF/C#中ProgressBar控件的基本使用,该控件有两种使用方式,分别为确实模式与不确定模式,确实模式就是知道进度是如何变化的,不确定模式就是不确定进度的变化情况,进度条一直在动,由于自带的ProgressBar只有条形的,可能无法满足日常的开发需求,因此跟大家介绍了HandyControl中ProgressBar的用法,在HandyControl的进度条有其他样式。希望对正在学习WPF的同学有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/605094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kafka应用Demo:多消费者实例按主题订阅消费消息,增强系统可靠性

环境搭建 在本地启动两个消费者进程&#xff0c;配置同的群组&#xff08;neo1&#xff09;, 订阅同一个主题消费消息。 生产者和消费者代码与《Kafka应用Demo&#xff1a;按主题订阅消费消息》相同。 测试步骤 生产者发送多个数字消息到kafka队列&#xff0c; 可以看到只有…

MouseBoost PRO mac中文激活版:专业鼠标助手

MouseBoost PRO mac鼠标性能优化软件&#xff0c;以其强大的功能和智能化的操作&#xff0c;助您轻松驾驭鼠标&#xff0c;提高工作效率。 MouseBoost PRO支持自定义快捷键设置&#xff0c;让您轻松实现快速切换应用程序、打开特定文件、调节音量大小等操作。自动识别窗口功能则…

运行npm install时报错“npm ERR! code 1”

目录 一、问题分析 二、解决问题 一、问题分析 有registry淘宝镜像地址过期的问题&#xff0c;改一下地址 npm淘宝镜像过期解决办法-CSDN博客主要问题是node-sass和sass-loader版本冲突 打开cmd&#xff0c;输入"node -v"查看node版本 我的版本是16&#xff0c;应…

java项目之智慧图书管理系统设计与实现(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智慧图书管理系统设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 智慧图书管理…

elk + filebeat 8.4.3 收集nginx日志(docker部署)

ELK filebeat docker部署 一、 elasticsearch部署1、运行elasticsearch临时配置容器2、拷贝文件目录到本地3、检查elasticsearch.yml4、删除之前elastic&#xff0c;运行正式容器5、docker logs记录启动日志 二、部署kibana1、运行kibana临时配置容器2、docker拷贝配置文件到本…

Java 11 到 Java 8 的兼容性转换

Java 11 到 Java 8 的兼容性转换 欲倚绿窗伴卿卿&#xff0c;颇悔今生误道行。有心持钵丛林去&#xff0c;又负美人一片情。 静坐修观法眼开&#xff0c;祈求三宝降灵台&#xff0c;观中诸圣何曾见&#xff1f;不请情人却自来。 入山投谒得道僧&#xff0c;求教上师说因明。争奈…

HFSS学习-day3-HFSS的工作界面

工作界面也称为用户界面&#xff0c;是HFSS软件使用者的工作环境:了解、熟悉这个工作环境是掌握HFSS软件使用的第一步 HFSS工作环境介绍 1.HFSS工作界面简单的组成说明2.工作界面中各个工作窗口功能主菜单工具栏项目管理窗口属性窗口信息管理窗口进程窗口三维模型窗口 3.HFSS主…

【qt】动态属性(下)

动态属性目录 一.最简单的属性二.访问类的所有属性三.运行时添加属性&#xff08;动态属性&#xff09;★四.总结 一.最简单的属性 想要对一个数据成员进行读和写我们一般都会使用set或者get这种类型的自定义的函数去间接访问&#xff0c;且使用非常的频繁。 因此咱们有一个最…

基于PSO粒子群优化的配电网可靠性指标matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 PSO算法应用于配电网优化的基本原理 5.完整程序 1.程序功能描述 基于PSO粒子群优化的配电网可靠性指标matlab仿真&#xff0c;指标包括saifi, saidi, caidi, aens四个。 2.测试软件版本…

【CTF Web】XCTF GFSJ0480 simple_js Writeup(JS分析+ASCII码)

simple_js 小宁发现了一个网页&#xff0c;但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 解法 查看网页源代码。 function dechiffre(pass_enc){var pass "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";var tab pass_enc.split(,);var …

VSCode-vue3.0-安装与配置-export default简单例子

文章目录 1.下载VSCode2.修改语言为中文3.辅助插件列表4.vue3模板文件简单例子5.总结 1.下载VSCode 从官网下载VSCode&#xff0c;并按下一步安装成功。 2.修改语言为中文 点击确认修改&#xff0c;如下图所示&#xff1a; 或者打开命令面板&#xff1a;输入Configure Displ…

93、动态规划-最长回文子串

思路 首先从暴力递归开始&#xff0c;回文首尾指针相向运动肯定想等。就是回文&#xff0c;代码如下&#xff1a; public String longestPalindrome(String s) {if (s null || s.length() 0) {return "";}return longestPalindromeHelper(s, 0, s.length() - 1);…

嵌入式开发八:STM32启动过程分析

本次给大家分析 STM32F4 的启动过程&#xff0c;这里的启动过程是指从 STM32 芯片上电复位执行的第一条指令开始&#xff0c;到执行用户编写的 main 函数这之间的过程。我们编写程序&#xff0c;基本都是用 C 语言编写&#xff0c;并且以 main 函数作为程序的入口。但是事实上&…

洛谷 P4148:简单题 ← KD-Tree模板题

【题目来源】https://www.luogu.com.cn/problem/P4148【题目描述】 你有一个 NN 的棋盘&#xff0c;每个格子内有一个整数&#xff0c;初始时的时候全部为 0&#xff0c;现在需要维护两种操作&#xff1a; ● 1 x y A → 1≤x,y≤N&#xff0c;A 是正整数。将格子 (x,y) 里的数…

【Shell脚本】Shell编程之条件语句

目录 一.条件测试 1.test命令 1.1.test命令是内部命令 1.2.格式一 1.3.格式二 2.文件测试 2.1.常用的测试操作符 3.整数值测试 3.1.常用的测试操作符 3.2.格式一 3.3.格式二 4.字符串比较 4.1.格式一 4.2.格式二 注意&#xff1a; 5.逻辑测试 5.1.常用的测试操…

机器学习 - 梯度下降算法推导

要逐步推导多变量线性回归的梯度计算过程&#xff0c;我们首先需要明确模型和损失函数的形式&#xff0c;然后逐步求解每个参数的偏导数。这是梯度下降算法核心部分&#xff0c;因为这些偏导数将指导我们如何更新每个参数以最小化损失函数。 模型和损失函数 考虑一个多变量线…

“人工智能+”推进新质生产力发展论坛暨工作室实践实训基地授牌仪式圆满结束

4月27日&#xff0c;由江西财经大学现代经济管理学院主办的“人工智能”推进新质生产力发展论坛暨“江财现经管泰迪数智技术”校企工作室实践实训基地授牌仪式在江西财经大学现代经济管理学院共青城校区举行&#xff0c;学院院长王金海&#xff0c;副院长丁美东&#xff0c;副院…

为什么选择ATECLOUD自动化测试平台?

在当今飞速发展的时代&#xff0c;一切都在不断进步与变革&#xff0c;电测行业也由手动测试逐步转向了自动化测试。但是随着科技的发展&#xff0c;对于产品的测试要求也越来越高&#xff0c;传统的自动化测试系统已经无法满足用户日益增长的测试需求&#xff0c;全新的ATE测试…

[沫忘录]MySQL储存对象

[沫忘录]MySQL储存对象 视图 视图本质是对原表(基表)显示上的裁剪&#xff0c;可以当作表进行操作&#xff0c;其操作的结果会直接反馈到原表上&#xff0c;即对视图的操作实质上是对原表的操作。 MySQL不仅支持为基表创建视图&#xff0c;同时也支持为视图创建视图。 基本语…

【C++】详解STL容器之一的 vector

目录 概述 迭代器 数据结构 优点和缺点 接口介绍 begin end rbegin rend resize reseve insert erase 其他一些接口 模拟实现 框架 获取迭代器 深浅拷贝 赋值重载 reseve resize 拷贝构造 构造 析构 insert erase 其他 概述 vector是STL的容器之一。…