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的同学有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【c++】继承学习(三)菱形继承的挑战与虚拟继承的策略

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来讲解继承的第三部分&#xff0c;有关多继承和菱形继承的内容 目录 1.菱形继承2.虚拟继承3.虚拟继承解决数据冗余和二义性的原理4.继承的总结和反思继承…

团结引擎+OpenHarmony 3 通信

团结引擎和鸿蒙之间通信 因为 ts 并没有像 JAVA 有反射的调用&#xff0c;所以我们必须要像 Web GL 平台一样通过导出的行为告诉引擎到底哪些 ts 的接口可以给 C# 来调用。 1 在 Tuanjie 引擎里 需要一个tsllib文件&#xff0c;用于设置给导出对象 C#使用。就可以直接创建以 …

回答篇:测试开发高频面试题目

引用之前文章&#xff1a;《测试开发高频面试题目》 https://blog.csdn.net/qq_41214208/article/details/138193469?spm1001.2014.3001.5502 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 什么是测试开发以及其在软件开发流程中的作用。 a. 测试开发是指测试人员或…

MyBatis认识

一、定义 MyBatis是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java O…

无人机+通信中继:短波电台技术详解

随着无线通信技术的不断发展&#xff0c;无人机作为一种新型的信息传输平台&#xff0c;已经在多个领域得到了广泛应用。其中&#xff0c;无人机与短波电台的结合&#xff0c;为通信中继领域带来了全新的可能性。本文将详细解析无人机在通信中继中的应用&#xff0c;以及短波电…

十二届蓝桥杯Python组1月中/高级试题 第一题

** 十二届蓝桥杯Python组1月中/高级试题 第一题 第一题&#xff08;难度系数2&#xff0c;18 个计分点&#xff09; 编程实现&#xff1a; 输入一个字符串&#xff0c;输出这个字符串的最后一个字符。 输入描述&#xff1a;输入一个字符串 输出描述&#xff1a;输出这个字符串…

Electron项目中将CommonJS改成使用ES 模块(ESM)语法preload.js加载报错

问题 将Electron项目原CommonJS语法改成使用ES 模块&#xff08;ESM&#xff09;语法&#xff0c;preload.js一直加载不到&#xff0c;报错如下&#xff1a; VM111 renderer_init:2 Unable to load preload script: D:\Vue\wnpm\electron\preload.js VM111 renderer_init:2 E…

Hive SQL-DQL-Select查询语句用法详解

HQL Select用法详解 1.基础语法 &#xff08;1&#xff09;select_exp &#xff08;2&#xff09;ALL、DISTINCT &#xff08;3&#xff09;WHERE &#xff08;4&#xff09;分区查询、分区裁剪 &#xff08;5&#xff09;GROUP BY &#xff08;6&#xff09;HAVING &#xff0…

运用分支结构与循环结构写一个猜拳小游戏

下面我们运用平常所学的知识来写一个小游戏&#xff0c;这样能够加强我们学习的趣味性&#xff0c;并且能够更加的巩固我们所学的知识。 游戏代码&#xff1a; 直接放代码&#xff1a;&#xff08;手势可以使用数字来代替&#xff0c;比如0对应石头&#xff0c;1对应剪刀&…

Linux环境Redis部署

Redis部署 Redis是一个高性能的开源键值存储系统&#xff0c;它主要基于内存操作&#xff0c;但也支持数据的持久化。与其他数据库相比&#xff0c;Redis的主要优势在于它的高性能、丰富的数据结构和原生的持久化能力。Redis不仅提供了类似的功能&#xff0c;还增加了持久化和…

【MySQL】ON WHERE 和 ON AND 的区别

1. 查询语句语法规则 “[ ]” 包含的内容可以省略&#xff1b; “{ }” 包含的内容必须存在&#xff1b; DISTINCT&#xff1a; 设定 **distinct** 可以去掉重复记录&#xff1b; AS&#xff1a; 表明或字段名过长时&#xff0c;可以用 **AS** 关键字起别名&#xff0c;也可…

HTML Audio标签src使用base64字符

源码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Audio src base64</title> </head> <body><audio controls><source src"data:audio/mp3;base64,//OIxAAAAAAAAAA…

钟表——蓝桥杯十三届2022国赛大学B组真题

问题分析 这个问题的关键有两点&#xff1a;1.怎么计算时针&#xff0c;分针&#xff0c;秒针之间的夹角&#xff0c;2.时针&#xff0c;分针&#xff0c;秒针都是匀速运动的&#xff0c;并非跳跃性的。问题1很好解决看下面的代码就能明白&#xff0c;我们先考虑问题2&#xf…

HTML学习|网页基本信息、网页基本标签、图像标签、超链接标签、列表标签、表格标签、媒体元素、页面结构分析、iframe内联框架

网页基本信息 DOCTYPE是设置使用什么规范&#xff0c;网页整个信息都在html标签中&#xff0c;head标签里包含字符集设置&#xff0c;网页介绍等信息&#xff0c;title标签是网页的名称&#xff0c;网页的主干都在body标签中 网页基本标签 标题标签 h1~h6都是标题标签&#x…

大模型的不足与解决方案

文章目录 ⭐ 不具备记忆能力 上下文窗口受限⭐ 实时信息更新慢 新旧知识难区分⭐ 内部操作很灵活 外部系统难操作⭐ 无法为专业问题 提供靠谱的答案⭐ 解决方案的结果 各有不同的侧重 在前面三个章节呢&#xff0c;为大家从技术的角度介绍了大模型的历程与发展&#xff0c;也为…

【35分钟掌握金融风控策略16】贷前风控策略详解-1

目录 贷前风控策略详解 贷前风控目标 精准审核申请贷款客户资质 对申请贷款客户进行合理定额 对申请贷款客户进行合理定价 推动实现利润最大化 贷前风控数据源 客户贷款时提供的数据 贷前风控策略详解 俗话说&#xff0c;良好的开端是成功的一半&#xff0c;而贷前是风…

Metasploit Framework(MSF)从入门到实战(二)

Metasploit Framework&#xff08;MSF&#xff09;从入门到实战&#xff08;一&#xff09;_安装msf更新-CSDN博客 MSF模块介绍 MSF有7个模块&#xff0c;分别对下面目录下的7个子文件夹&#xff1a; auxiliary&#xff08;辅助模块 &#xff09; show auxiliary //查看所有…

Ansible-inventory和playbook

文章目录 一、inventory 主机清单1、列表表示2、inventory 中的变量3、变量3.1 主机变量3.2 组变量3.3 组嵌套 二、playbook剧本1、playbook的组成2、编写剧本2.1 剧本制作2.2 准备nginx.conf2.3 运行剧本2.4 查看webservers服务器2.5 补充参数 3、剧本定义、引用变量3.1 剧本制…

ICode国际青少年编程竞赛- Python-2级训练场-列表遍历

ICode国际青少年编程竞赛- Python-2级训练场-列表遍历 1、 for i in range(3):Flyer[i].step(2) Dev.step(6)2、 for i in range(7):Flyer[i].step() Dev.step(Item.x - Dev.x)3、 for i in range(3):Flyer[i].step(1) Dev.step(4) Dev.turnLeft() Dev.step(2) Dev.turnL…

java11基础(接口 static关键字)

目录 一. 接口 1. 接口的定义 2. 接口的实现 3. Comparable接口 4. 抽象类和接口的区别 小结 二. static关键字 1. 静态成员变量 2. static 静态方法 3. static静态代码块 格式: 作用: 执行顺序: 三. 接口拓展 default 和 static 一. 接口 如果一个抽象类没有字段…