WPF中实现弹出进度条窗口

简介: 【11月更文挑战第14天】在WPF中实现弹出进度条窗口,需创建进度条窗口界面(XAML)和对应的代码-behind(C#)。通过定义`ProgressWindow`类,包含`ProgressBar`和`TextBlock`,并在主窗口或逻辑代码中调用,模拟长时间任务时更新进度条,确保UI流畅。

在 WPF(Windows Presentation Foundation)中实现弹出进度条窗口可以通过以下步骤:


1. 创建进度条窗口的界面(XAML 部分)


  • 首先,在你的项目中添加一个新的窗口(例如ProgressWindow.xaml)。
  • ProgressWindow.xaml中,设计进度条的布局。典型的布局可能包括一个ProgressBar控件和一些用于显示进度相关信息的文本标签。以下是一个简单的示例:


<Window x:Class="YourNamespace.ProgressWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Progress Window" Height="100" Width="300">
    <Grid>
        <ProgressBar x:Name="progressBar" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
        <TextBlock x:Name="progressText" HorizontalAlignment="Center" VerticalAlignment="Bottom"/>
    </Grid>
</Window>


这段 XAML 代码定义了一个简单的窗口,其中包含一个水平方向拉伸以填充窗口宽度的进度条(ProgressBar),以及一个位于窗口底部中央用于显示进度文本的TextBlock


2. 创建进度条窗口的代码 - behind(C# 部分)


  • ProgressWindow.xaml.cs文件中,添加方法来更新进度条的值和相关文本信息。例如:


using System;
using System.Windows;
namespace YourNamespace
{
    public partial class ProgressWindow : Window
    {
        public ProgressWindow()
        {
            InitializeComponent();
        }
        public void UpdateProgress(double progress, string message)
        {
            progressBar.Value = progress;
            progressText.Text = message;
        }
    }
}


这里定义了一个UpdateProgress方法,用于接收进度值(0 - 100 之间的双精度数)和一个消息字符串,然后更新进度条和文本显示。


3. 在主窗口或其他逻辑代码中使用进度条窗口


  • 例如,在主窗口(假设是MainWindow.xaml.cs)的某个按钮点击事件或者长时间运行的任务中,弹出并更新进度条窗口。以下是一个简单的示例,模拟一个长时间运行的任务并更新进度:


using System;
using System.Threading;
using System.Windows;
namespace YourNamespace
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ProgressWindow progressWindow = new ProgressWindow();
            progressWindow.Show();
            // 模拟一个长时间运行的任务
            Thread backgroundThread = new Thread(() =>
            {
                for (int i = 0; i <= 100; i++)
                {
                    Thread.Sleep(100);
                    progressWindow.Dispatcher.Invoke(() =>
                    {
                        progressWindow.UpdateProgress(i, $"Progress: {i}%");
                    });
                }
                progressWindow.Close();
            });
            backgroundThread.Start();
        }
    }
}


在上述代码中:


  • 当主窗口中的按钮被点击时,首先创建并显示ProgressWindow
  • 然后启动一个新的线程来模拟长时间运行的任务。在这个任务中,每隔 100 毫秒更新一次进度条的值和相关文本,通过Dispatcher.Invoke确保在 UI 线程上更新进度条(因为 WPF 的 UI 元素只能在创建它们的 UI 线程上更新)。
  • 当进度达到 100% 后,关闭进度条窗口。


这只是一个简单的示例,实际应用中,进度条的更新逻辑需要根据具体的业务逻辑(如文件下载、数据处理等)来确定。

相关文章
|
3月前
|
C#
WPF 自定义可拖动标题栏
WPF 自定义可拖动标题栏
51 0
|
6月前
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
200 2
|
容器 网络架构 C#
WPF 控件库——可拖动选项卡的TabControl
原文:WPF 控件库——可拖动选项卡的TabControl 一、先看看效果   二、原理 1、选项卡大小和位置   这次给大家介绍的控件是比较常用的TabControl,网上常见的TabControl样式有很多,其中一部分也支持拖动选项卡,但是带动画效果的很少见。
1621 0
|
C# 索引
WPF实用指南二:移除窗体的图标
原文:WPF实用指南二:移除窗体的图标 WPF没有提供任何功能来移除窗体上的icon图标。一般的做法是设置一个空白的图标,如下图1: 这种做法在窗体边框与标题之间仍然会保留一片空白。
1256 0
|
C#
winform,wpf全屏 还显示任务栏的解决方法
原文:winform,wpf全屏 还显示任务栏的解决方法 以wpf为例: 全屏代码: this.Topmost = true; this.WindowStyle = System.Windows.WindowStyle.
1896 0
|
C#
WPF 自定义窗口关闭按钮
原文:WPF 自定义窗口关闭按钮 关闭图标设计主要涉及主要知识点: 1、Path,通过Path来画线。当然一般水平、竖直也是可以用Rectangle/Border之类的替代      一些简单的线条图标用Path来做,还是很方便的。
1211 0
|
C# Windows Web App开发
WPF 应用完全模拟 UWP 的标题栏按钮
原文:WPF 应用完全模拟 UWP 的标题栏按钮 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
1088 0
|
C#
【WPF】右键菜单ContextMenu可点击区域太小的问题
原文:【WPF】右键菜单ContextMenu可点击区域太小的问题 问题描述 正常使用右键菜单ContextMenu时,如果菜单项是不变的,可以直接在XAML中写死,如下是给一个Button按钮添加了右键菜单功能。
1551 0
|
C#
WPF 标题栏 右键窗口标题添加关于对话框
原文:WPF 标题栏 右键窗口标题添加关于对话框 /// /// wpf标题栏 右键菜单 中添加新项 /// public partial class MainWindow : Window { private const int W...
1229 0