实用指南:C#中优雅更新GUI的基础和高级技巧(WinForms和WPF)

这篇具有很好参考价值的文章主要介绍了实用指南:C#中优雅更新GUI的基础和高级技巧(WinForms和WPF)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实用指南:C#中优雅更新GUI的基础和高级技巧(WinForms和WPF)

 

概述:以上内容详细介绍了在C#中如何从另一个线程更新GUI,包括基础功能和高级功能。对于WinForms,使用`Control.Invoke`;对于WPF,使用`Dispatcher.Invoke`。高级功能使用`SynchronizationContext`实现线程间通信,确保清晰、可读性高的代码。

在C#中,从另一个线程更新GUI通常需要使用UI线程的同步上下文(SynchronizationContext)或者专门用于在UI线程执行操作的方法(Control.InvokeDispatcher.Invoke)。下面分别给出在WinForms和WPF中的基础功能和高级功能的实例源代码。

在WinForms中更新GUI:

基础功能:

  1. 创建WinForms应用程序: 创建一个包含按钮和标签的WinForms应用程序。
  2. 创建后台线程: 使用Thread类或Task.Run创建一个后台线程,模拟耗时操作。
  3. 使用Invoke更新UI: 在后台线程中使用Control.Invoke更新UI。

示例源代码:

using System;
using System.Threading;
using System.Windows.Forms;

namespace WinFormsThreadedGUIUpdate
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void btnStartTask_Click(object sender, EventArgs e)
        {
            // 启动后台任务
            Thread thread = new Thread(PerformTask);
            thread.Start();
        }

        private void PerformTask()
        {
            // 模拟耗时操作
            Thread.Sleep(3000);

            // 在UI线程上更新标签文本
            UpdateLabel("Task 完成!");
        }

        private void UpdateLabel(string text)
        {
            if (lblStatus.InvokeRequired)
            {
                // 在UI线程上异步执行更新操作
                lblStatus.Invoke(new Action(() => lblStatus.Text = text));
            }
            else
            {
                // 在UI线程上直接更新操作
                lblStatus.Text = text;
            }
        }
    }
}

在WPF中更新GUI:

基础功能:

  1. 创建WPF应用程序: 创建一个包含按钮和标签的WPF应用程序。
  2. 创建后台线程: 使用Task.Run创建一个后台线程,模拟耗时操作。
  3. 使用Dispatcher更新UI: 在后台线程中使用Dispatcher.Invoke更新UI。

示例源代码:

using System;
using System.Threading;
using System.Windows;

namespace WPFThreadedGUIUpdate
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnStartTask_Click(object sender, RoutedEventArgs e)
        {
            // 启动后台任务
            Task.Run(() =>
            {
                // 模拟耗时操作
                Thread.Sleep(3000);

                // 在UI线程上更新标签文本
                UpdateLabel("Task 完成!");
            });
        }

        private void UpdateLabel(string text)
        {
            if (Dispatcher.CheckAccess())
            {
                // 在UI线程上直接更新操作
                lblStatus.Content = text;
            }
            else
            {
                // 在UI线程上异步执行更新操作
                Dispatcher.Invoke(new Action(() => lblStatus.Content = text));
            }
        }
    }
}

高级功能:

在高级功能中,WinForms和WPF均可以使用SynchronizationContext进行线程间通信,代码更为简洁。

示例源代码:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AdvancedThreadedGUIUpdate
{
    public partial class MainForm : Form
    {
        private readonly SynchronizationContext synchronizationContext;

        public MainForm()
        {
            InitializeComponent();

            // 获取当前同步上下文
            synchronizationContext = SynchronizationContext.Current;
        }

        private void btnStartTask_Click(object sender, EventArgs e)
        {
            // 启动后台任务
            Task.Run(() =>
            {
                // 模拟耗时操作
                Thread.Sleep(3000);

                // 在UI线程上更新标签文本
                synchronizationContext.Post(new SendOrPostCallback(UpdateLabel), "Task 完成!");
            });
        }

        private void UpdateLabel(object state)
        {
            // 在UI线程上更新标签文本
            lblStatus.Text = state.ToString();
        }
    }
}

在WPF中,Dispatcher本身就是一种同步上下文,所以代码更为简洁,无需额外的同步上下文对象。高级功能的WPF示例代码与基础功能示例代码相似。

源代码:https://pan.baidu.com/s/1BtKPnYujG5KO-poCnzKk7A?pwd=6666 

 

实用指南:C#中优雅更新GUI的基础和高级技巧(WinForms和WPF)文章来源地址https://www.toymoban.com/news/detail-841027.html

到了这里,关于实用指南:C#中优雅更新GUI的基础和高级技巧(WinForms和WPF)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# GUI编程入门指南:学习如何使用C#创建图形用户界面

    C# GUI编程入门指南:学习如何使用C#创建图形用户界面 在本文中,我们将介绍如何使用C#编写GUI程序。GUI(Graphical User Interface)是一种以图形方式呈现信息和操作功能的界面,它使得用户与计算机更加直观和友好。C#是一种强大的编程语言,它提供了丰富的库和工具来帮助我们

    2024年01月21日
    浏览(42)
  • 掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)

    Go语言中的结构体(Struct)除了基本的定义和使用外,还有一些高级用法,可以让我们更灵活地使用结构体。下面详细解释一些高级用法: 结构体嵌套 结构体可以嵌套在其他结构体中,形成更复杂的数据结构。这种嵌套可以使代码更清晰,更符合逻辑。同时,可以通过嵌套来

    2024年03月27日
    浏览(48)
  • ChatGPT中文版Prompt提示工程超详细指南《提示工程高级技巧与技术》Github最新破万星项目Meta AI前工程师解密百万年薪提示工程师GPT-4模型优化利器(二)不定期更新

    随着时代的进步和技术的不断发展,提示工程已然脱胎换骨,从简单的提示编写和测试逐渐演变成了一门更加复杂、具有挑战性的高科技领域。对于资深提示工程师来说,唯有不断学习和掌握新技术,才能在这个充满机遇和挑战的领域中取得成功。 在掌握了更高级的提示工程

    2024年02月12日
    浏览(42)
  • 深度解析Vue Router原理:实战指南与实用技巧

    大家好,欢迎来到程序视点! 今天跟大家简单聊聊Router的实现原理,以及我们如何去实现这样一个插件。 Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。关于 Vue Router 的使用就不做过多介绍了,大家可以前往 Vue Router 官网去学习

    2024年02月15日
    浏览(57)
  • 【科研绘图】MacOS系统OmniGraffle实用指南(持续更新)

    用过不少绘图软件,包括Visio (only for Windows)、ProcessOn、draw.io等主流软件,然后换Mac后尝试了实验室在用的OmniGraffle,才第一次感受到了绘图软件的人性化和强大! 按住 Shift 后调整元素位置或调整线段,可以保证是沿着水平/垂直方向进行 control + L :锁定某个元素 option + comm

    2024年01月16日
    浏览(33)
  • AI抠图使用指南:Stable Diffusion WebUI Rembg实用技巧

      抠图是图像处理工具的一项必备能力,可以用在重绘、重组、更换背景等场景。最近我一直在探索 Stable Diffusion WebUI 的各项能力,那么 SD WebUI 的抠图能力表现如何呢?这篇文章就给大家分享一下。 作为一个生成式AI,SD本身并没有精细的抠图控制能力,它需要借助插件来实

    2024年02月14日
    浏览(41)
  • 【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

    方法引用是Java编程语言中的一个重要特性,它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambda表达式的代码,使代码更加清晰、简洁。 方法引用是通过名称引用一个现有的方法来代替Lambda表达式的一种方式 。它允许将方法本身作为一个对象传递或存储,并

    2024年02月16日
    浏览(30)
  • C# 布尔值和条件语句:入门指南和实用示例

    在编程中,通常需要一个只能有两个值之一的数据类型,比如: 是 / 否 开 / 关 真 / 假 为此,C# 有一个 bool 数据类型,可以取 true 或 false 的值。 使用 bool 声明布尔类型,只能取 true 或 false 的值: 示例: 然而,更常见的是从布尔表达式中返回布尔值,用于条件测试。

    2024年01月21日
    浏览(54)
  • C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法

    字符串用于存储文本。一个字符串变量包含由双引号括起的字符集合 示例: 如果需要,一个字符串变量可以包含多个单词: 示例: 在 C# 中,字符串实际上是一个对象,其中包含可以在字符串上执行某些操作的属性和方法。例如,可以使用 Length 属性找到字符串的长度: 示例

    2024年01月20日
    浏览(33)
  • 线性代数之美:从基础知识到高级技巧

    线性代数是数学的一个分支,它研究的是线性方程组和线性空间等概念。线性代数在许多科学和工程领域都有广泛的应用,例如机器学习、计算机图形学、信号处理等。在这篇文章中,我们将从基础知识到高级技巧来详细讲解线性代数的核心概念、算法原理、具体操作步骤以

    2024年01月20日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包