WPF/C#:ProgressBar的基本使用

news2024/12/24 8:51:27

前言

在日常开发过程中,如果遇到需要一段时间才能完成的任务,通常需要给用户一个进度条提示。今天给大家介绍的是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://www.coloradmin.cn/o/1655461.html

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

相关文章

AI图书推荐:ChatGPT在真实商业世界中的应用

《ChatGPT在真实商业世界中的应用》 (Unleashing The Power of ChatGPT: A Real World Business Applications)首先概述了ChatGPT及其在对话式人工智能领域的影响。接着&#xff0c;你将深入了解ChatGPT的技术方面&#xff0c;理解机器学习算法和自然语言处理如何在后台工作。然…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

红帽为 Red Hat OpenShift AI 扩大与 Elasticsearch 向量数据库的合作

作者&#xff1a;来自 Elastic Aditya Tripathi 红帽和 Elastic 今天宣布开展合作&#xff0c;以便在 Red Hat OpenShift AI 上集成 Elasticsearch 向量数据库。 Red Hat OpenShift 用户现在可以通过红帽生态系统目录实施 Elasticsearch 以进行向量搜索和检索增强生成 (RAG) 应…

Blender动画与云渲染:创造高质量作品的未来路径

Blender作为开源的3D图形软件&#xff0c;在多个领域广受欢迎。但随着项目复杂度提升&#xff0c;传统渲染方式受限。云渲染技术的兴起突破了这些限制&#xff0c;为创作者提供了更自由、高效的创作环境。 一、Blender动画项目的挑战 传统上&#xff0c;Blender动画渲染需要依…

C++新手村指南:入门基础

目录 C概念 C发展史 C关键字&#xff08;C98&#xff09; 命名空间 命名空间的定义 命名空间的使用 C中的输入&&输出 缺省参数 缺省参数的概念 缺省参数的分类 函数重载 函数重载概念 函数重载实现 引用 引用的概念 引用的特性 常引用 引用的使用场景…

SpringBoot分页查询报错Bug

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 使用pageHepler分页查询报错信息为 class java.util.ArrayList cannot be cast to class com.github.pagehelper.Page问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 实现条件分…

树莓派变小路由器放出热点wifi

环境 树莓派4Bubuntu20 作用 树莓派放出wifi后&#xff0c;笔记本电脑连接树莓派的wifi&#xff0c;并且ip配置在一个网段&#xff0c;就可以互相通信&#xff08;笔记本放出wifi&#xff0c;树莓派连接效果一样&#xff09;&#xff0c;这样的好处是树莓派只要一上电就会自…

标准I/O库-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

标准I/O库 1、标准I/O库简介 什么是标准I/O库 标准C库当中用于文件I/O操作相关的一套库函数&#xff0c;使用标准I/O需要包含头文件 标准I/O和文件I/O之间的区别 标准I/O是库函数&#xff0c;而文件I/O是系统调用 标准I/O是对文件I/O的封装 可移植性&#xff1a;标准I/O相…

如何在Ubuntu 24.04或23.04中加密主文件夹

最新版本的 Ubuntu 强制加密整个磁盘&#xff0c;而不仅仅是一个分区&#xff0c;这意味着双系统用户无法完全加密他们的 Ubuntu 机器&#xff0c;因此加密你的Home 文件夹是最佳选择。 对于不熟悉磁盘加密的人来说&#xff0c;这是一种通过加密来保护 Ubuntu 文件的方法。这个…

Java基于Spring Boot框架的校园外卖服务系统设计与实现(附源码,说明文档)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

集成学习案例-幸福感预测

集成学习案例一 &#xff08;幸福感预测&#xff09; 背景介绍 此案例是一个数据挖掘类型的比赛——幸福感预测的baseline。比赛的数据使用的是官方的《中国综合社会调查&#xff08;CGSS&#xff09;》文件中的调查结果中的数据&#xff0c;其共包含有139个维度的特征&#xf…

HSL和RGB 互转的 原理 分析

定义 HSL即色相、饱和度、亮度&#xff08;英语&#xff1a;Hue, Saturation, Lightness&#xff09;。 色相&#xff08;H&#xff09;是色彩的基本属性&#xff0c;就是平常所说的颜色名称&#xff0c;如红色、黄色等。可以说和光谱对应。取值为0-360度。 …

java语言数据结构(单链表)

前言 不得承认java应用的广泛&#xff0c;所以毅然决定java版本的数据结构和算法专题还是要坚决更新。每日更新2题&#xff0c;希望学习的小伙伴可以关注一波跟上&#xff0c;评论区欢迎讨论交流。 实现原理 节点&#xff08;Node&#xff09;&#xff1a;链表的基本构建单元…

Qt | QLineEdit 类(行编辑器)

01、上节回顾 Qt | QComboBox(组合框)02、QLineEdit 1、QLineEdit 类是 QWidget 类的直接子类,该类实现了一个单行的 输入部件,即行编辑器,见右图 2、验证器(QValidator 类)和输入掩码简介:主要作用是验证用户输入的字符是否符合验证器 的要求,即限制对用户的输入,比…

Windows环境编译MediaInfo源码详细过程

MediaInfo介绍 MediaInfo是一个自由开源的软件&#xff0c;它提供了一种方法来显示多媒体文件的详细信息&#xff0c;包括视频、音频和图像文件。 以下是关于MediaInfo的一些主要介绍&#xff1a; 功能&#xff1a;MediaInfo可以显示文件的格式、编码信息、长度、比特率、帧率…

Tomcat添加服务以及设置开机自启

下载地址连接 Index of /dist/tomcat&#x1f453; 注意点&#xff1a;不要出现中文路径 #环境变量 CATALINA_HOMED:\apache-tomcat-7.0.62 TOMCAT_HOMED:\apache-tomcat-7.0.62 JAVA_HOMED:\tool\jdk1.8.0_111 PATH%CATALINA_HOME%\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\…

如何使用Vite快速构建vue项目

1、在自己定义的目录下打开cmd命令窗口&#xff1a;如文件夹目录上面输入cmd回车就可以打开 2、检查 node环境&#xff1a;通过node --version看版本号表示安装好了 3、 使用Vite 快速构建Vue项目 npm init vitelatest qiuqiu.admin 注意&#xff1a;如何你电脑没有装vite首…

C/C++常用的内置的宏定义

常用的C/C 内置宏 这是我在VS2015下运行的 cout << "file " << __FILE__ << endl;cout << "line " << __LINE__ << endl;cout << "date " << __DATE__ << endl;cout << "…

[公开课学习]台大李宏毅-自注意力机制 Transformer

自注意力机制 存在一些问题&#xff0c;将vector set/sequence作为input&#xff0c;例如&#xff1a; 文字处理&#xff1a;将文字用one-hot表示&#xff0c;或者向量空间的向量表示&#xff0c;然后进行翻译任务等语音处理&#xff1a;25ms音频作为一个向量&#xff0c;10m…

开源离线AI笔记应用

前言 Reor 是一款人工智能驱动的桌面笔记应用程序&#xff0c;它能自动链接相关笔记、回答笔记中的问题并提供语义搜索。所有内容都存储在本地&#xff0c;支持 Windows、Linux 和 MacOS。Reor 站在 Ollama、Transformers.js 和 LanceDB 等巨头的肩膀上&#xff0c;使 LLM 和嵌…