【WPF】异步任务更新UI、绑定命令、绑定字符串属性

这篇具有很好参考价值的文章主要介绍了【WPF】异步任务更新UI、绑定命令、绑定字符串属性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

wpf异步更新ui,WPF,C#,wpf,ui,c#

WPF异步任务

wpf异步更新ui,WPF,C#,wpf,ui,c#

主界面

属性改变触发UI更新:

        //打印的内容:文本框显示的内容
        public string PrintNumbers
        {
            get { return printNumbers; }
            set
            {
                printNumbers = value;
                RaisePropertyChanged();
            }
        }
        <TextBox Name="Execution" HorizontalAlignment="Right"
                 Height="649" Margin="0,10,10,0" TextWrapping="Wrap"
                 ScrollViewer.HorizontalScrollBarVisibility="Visible"
                 ScrollViewer.VerticalScrollBarVisibility="Auto"
                 Text="{Binding PrintNumbers,Mode=TwoWay,
                 UpdateSourceTrigger=PropertyChanged}"
                 VerticalAlignment="Top" Width="692" Grid.Column="1" />

命令绑定:

在视图模型中定义命令:

        //绑定的命令
        public ICommand StartButtonCommand { get; set; }
        public ICommand AddTaskCommand { get; set; }
        public ICommand ClearAllData { get; set; }

在主界面xaml中绑定命令:

        <Button Content="Start Task"  Height="36"
                Margin="10,30,797,0" 
                VerticalAlignment="Top"
                Width="119" Command="{Binding StartButtonCommand}" Grid.Column="1"/>

 创建命令实例:文章来源地址https://www.toymoban.com/news/detail-708816.html

            StartButtonCommand = new DelegateCommand(TaskExecutionOrder);
            AddTaskCommand = new DelegateCommand(SelectedTaskExecution);
            ClearAllData = new DelegateCommand(ClearData);

绑定RadioButton属性:

        //radiobutton绑定的属性  
        public bool IsOddChecked //选择奇数属性
        {
            get { return isOddChecked; }
            set { SetProperty(ref isOddChecked, value); RaisePropertyChanged(); }
        }
        //radiobutton绑定的属性 
        public bool IsEvenChecked//选择偶数属性
        {
            get { return isEvenChecked; }
            set { SetProperty(ref isEvenChecked, value); RaisePropertyChanged(); }
        }
 <RadioButton x:Name="chckOddNum" Content="OddNumbers" 
                     HorizontalAlignment="Left" Margin="10,413,0,0" 
                     VerticalAlignment="Top"  
                     IsChecked="{Binding IsOddChecked,Mode=TwoWay,
                     UpdateSourceTrigger=PropertyChanged}" Height="44" Width="119" RenderTransformOrigin="1,0.546" Grid.Column="1"/>

执行异步任务:

        private static Queue<Action> queue = new Queue<Action>();//操作队列
        private static readonly object queuelock = new object();//队列锁
Task.Run(() => ExecuteTasks());//执行异步任务,从队列中取出任务动作
  //开始按钮执行异步任务
        private async void ExecuteTasks()
        {
            
            while (true)
            {
                Action task = null;
                lock (queuelock)
                {
                    if (queue.Count > 0)
                    {
                        task = queue.Dequeue();//取出一个任务操作
                    }
                }
                if (task != null)
                {
                    await Task.Run(() =>
                    {
                        task.Invoke();
                        Thread.Sleep(100);
                    });
                }

            }
        }
        //开始按钮委托命令  :执行 奇数、偶数任务
        public void TaskExecutionOrder()
        {
            queue.Enqueue(OddNumbers);
            queue.Enqueue(EvenNumbers);
            taskCount = queue.Count;//任务数
        }
  //奇数任务操作
        private void OddNumbers()
        {
                Dispatcher.CurrentDispatcher.Invoke(() =>
               {
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += "OddNumbers between 1 to 100" + Environment.NewLine + "Task:" + " " + taskNumber.ToString();
                   this.PrintNumbers += Environment.NewLine;
                   this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Started" + "\n";

               });
                for (int i = 0; i <= 100; i++)
                {

                    Dispatcher.CurrentDispatcher.Invoke(() =>
                    {
                        if (i % 2 != 0)//奇数
                        {
                            this.PrintNumbers += i.ToString() + " "; //属性改变,触发UI更新

                            Thread.Sleep(10);
                        }

                    });

                }
                
                this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Stopped" + "\n";
                taskNumber++;//下一任务号
                Thread.Sleep(1000);
            
        }

完整代码:

XAML主界面:

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="53*"/>
            <ColumnDefinition Width="739*"/>
        </Grid.ColumnDefinitions>
        <TextBox Name="Execution" HorizontalAlignment="Right"
                 Height="649" Margin="0,10,10,0" TextWrapping="Wrap"
                 ScrollViewer.HorizontalScrollBarVisibility="Visible"
                 ScrollViewer.VerticalScrollBarVisibility="Auto"
                 Text="{Binding PrintNumbers,Mode=TwoWay,
                 UpdateSourceTrigger=PropertyChanged}"
                 VerticalAlignment="Top" Width="692" Grid.Column="1" />

        <Button Content="Start Task"  Height="36"
                Margin="10,30,797,0" 
                VerticalAlignment="Top"
                Width="119" Command="{Binding StartButtonCommand}" Grid.Column="1"/>

        <RadioButton x:Name="chckOddNum" Content="OddNumbers" 
                     HorizontalAlignment="Left" Margin="10,413,0,0" 
                     VerticalAlignment="Top"  
                     IsChecked="{Binding IsOddChecked,Mode=TwoWay,
                     UpdateSourceTrigger=PropertyChanged}" Height="44" Width="119" RenderTransformOrigin="1,0.546" Grid.Column="1"/>

        <RadioButton x:Name="chckEvenNum" Content="EvenNumbers" 
                     HorizontalAlignment="Left" Margin="10,462,0,0" 
                     VerticalAlignment="Top" IsChecked="{Binding IsEvenChecked,
                     Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Height="42" Width="119" Grid.Column="1"/>

        <Button Content="Add Task"  Height="31" HorizontalAlignment="Left"
            Margin="10,543,0,0" VerticalAlignment="Top" Width="119"
            Command="{Binding AddTaskCommand}" Grid.Column="1"/>

        <TextBox HorizontalAlignment="Left" Height="296" 
                 VerticalScrollBarVisibility="Auto" 
                 HorizontalScrollBarVisibility="Auto" Margin="31,88,0,0" 
                 VerticalAlignment="Top" Width="216" 
                 Text="{Binding ExecutionOrder,UpdateSourceTrigger=PropertyChanged}" Grid.ColumnSpan="2"/>

        <Button Content="ClearAll" HorizontalAlignment="Left" Margin="10,604,0,0" 
                VerticalAlignment="Top" Command="{Binding ClearAllData,
                UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Width="119" 
                Height="30" Grid.Column="1"/>
    </Grid>

主界面交互逻辑:

namespace MultiThreadingWPF
{
    using Prism.Commands;
    using Prism.Mvvm;
    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Input;
    using System.Windows.Threading;
    using MultiThreadingWPF.Model;

    public class MainWindowViewModel : BindableBase
    {

        private static Queue<Action> queue = new Queue<Action>();//操作队列
        private static readonly object queuelock = new object();//队列锁

        private string printNumbers;//打印的数字
        private string taskName;//任务名
        private static int taskNumber = 1;//任务号

        private TaskModel __taskModel;//任务模型  未使用

        private string executionOrder;//             执行订单

        private bool isOddChecked;//奇数选择字段
        private bool isEvenChecked;//偶数选择字段
        //绑定的命令
        public ICommand StartButtonCommand { get; set; }
        public ICommand AddTaskCommand { get; set; }
        public ICommand ClearAllData { get; set; }
        //任务数
        private int taskCount;
        //未使用TaskModel 
        public TaskModel TasksModel
        {
            get { return __taskModel; }
            set { SetProperty(ref __taskModel, value); RaisePropertyChanged(); }
        }
        
        public string ExecutionOrder//
        {
            get { return executionOrder; }
            set { SetProperty(ref executionOrder, value); RaisePropertyChanged(); }
        }
        //radiobutton绑定的属性  
        public bool IsOddChecked //选择奇数属性
        {
            get { return isOddChecked; }
            set { SetProperty(ref isOddChecked, value); RaisePropertyChanged(); }
        }
        //radiobutton绑定的属性 
        public bool IsEvenChecked//选择偶数属性
        {
            get { return isEvenChecked; }
            set { SetProperty(ref isEvenChecked, value); RaisePropertyChanged(); }
        }
        //任务名
        public string TaskName
        {
            get { return taskName; }
            set
            {
                taskName = value;
                RaisePropertyChanged();
            }
        }
        //打印的内容:文本框显示的内容
        public string PrintNumbers
        {
            get { return printNumbers; }
            set
            {
                printNumbers = value;
                RaisePropertyChanged();
            }
        }
       //任务数
        public int TaskCount
        {
            get { return taskCount; }
            set { taskCount = value; RaisePropertyChanged(); }
        }
        //主窗体视图模型
          public MainWindowViewModel()
        {
            TasksModel = new TaskModel(); 
            StartButtonCommand = new DelegateCommand(TaskExecutionOrder);
            AddTaskCommand = new DelegateCommand(SelectedTaskExecution);
            ClearAllData = new DelegateCommand(ClearData);
            Task.Run(() => ExecuteTasks());
        }
        //添加(选择的radiobuttion)任务按钮 委托命令   
        private void SelectedTaskExecution()
        {
            if(isEvenChecked)
            {
                Task.Run(()=>EvenNumbers());
            }
            else if(isOddChecked)
            {
                Task.Run(()=>OddNumbers());
            }
            else
            {
                this.PrintNumbers += "Please select any one Task to be executed"+"\n"; 
            }
        }
        //开始按钮委托命令  :执行 奇数、偶数任务
        public void TaskExecutionOrder()
        {
            queue.Enqueue(OddNumbers);
            queue.Enqueue(EvenNumbers);
            taskCount = queue.Count;
        }
        //开始按钮执行异步任务
        private async void ExecuteTasks()
        {
            
            while (true)
            {
                Action task = null;
                lock (queuelock)
                {
                    if (queue.Count > 0)
                    {
                        task = queue.Dequeue();//取出一个任务操作
                    }
                }
                if (task != null)
                {
                    await Task.Run(() =>
                    {
                        task.Invoke();
                        Thread.Sleep(100);
                    });
                }

            }
        }
        //偶数任务操作
        private void EvenNumbers()
        {       //线程池线程 调用UI控件绑定属性
                 Dispatcher.CurrentDispatcher.Invoke(() =>
                {
                    this.PrintNumbers += Environment.NewLine;
                    this.PrintNumbers += Environment.NewLine;
                    this.PrintNumbers += "EvenNumbers between 1 to 100" + Environment.NewLine + "Task:" + " " + taskNumber.ToString();
                    this.PrintNumbers += Environment.NewLine;
                    this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Started " + "\n";

                });

            for (int i = 0; i <= 100; i++)//偶数
            {
                Dispatcher.CurrentDispatcher.Invoke(() =>
                {
                    if (i % 2 == 0)
                    {
                        this.PrintNumbers += i.ToString() + " ";
                        Thread.Sleep(10);
                    }
                });
            }

            this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Stopped" + "\n";
            taskNumber++;
            Thread.Sleep(1000);
        }
        //奇数任务操作
        private void OddNumbers()
        {
                Dispatcher.CurrentDispatcher.Invoke(() =>
               {
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += "OddNumbers between 1 to 100" + Environment.NewLine + "Task:" + " " + taskNumber.ToString();
                   this.PrintNumbers += Environment.NewLine;
                   this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Started" + "\n";

               });
                for (int i = 0; i <= 100; i++)
                {

                    Dispatcher.CurrentDispatcher.Invoke(() =>
                    {
                        if (i % 2 != 0)//奇数
                        {
                            this.PrintNumbers += i.ToString() + " ";

                            Thread.Sleep(10);
                        }

                    });

                }
                
                this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Stopped" + "\n";
                taskNumber++;//下一任务号
                Thread.Sleep(1000);
            
        }
        //清空按钮 委托命令
        private void ClearData()
        {
            PrintNumbers = string.Empty;//文本框显示的内容
           
        }
       
    }
}

任务模型 TaskModel.cs----未使用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MultiThreadingWPF.Model 
{
    public class TaskModel : INotifyPropertyChanged
    {
        private string TaskName { get; set; }  //任务名
        private string PrintNumbers { get; set; } //打印的字符串

        public event PropertyChangedEventHandler PropertyChanged; //属性改变事件
    }
}

到了这里,关于【WPF】异步任务更新UI、绑定命令、绑定字符串属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • WPF 零基础入门笔记(3):数据绑定详解(更新中)

    WPF基础知识博客专栏 WPF微软文档 WPF控件文档 B站对应WPF数据绑定视频教程 我们在之前的文章中,详细解释了数据模版和控件模板。简单来说数据模板和控件模板就是为了解决代码重复的问题。我们可以回顾一下之前的所有内容。 为了不写重复的样式,WPF提供了样式设置 为了

    2024年02月11日
    浏览(27)
  • WPF——事件绑定命令

    我们都知道WPF中的命令在结合MVVM模式的框架使用之后(框架重新实现了ICommand),可以解耦。但并不是所有控件都可以绑定命令的,比如TextBox、ComboBox等。在使用这类控件时,如果你想让它的某个事件激发时调用ViewModel中的方法,往往需要把ViewModel中的方法暴露给View,然后在

    2024年02月05日
    浏览(48)
  • WPF绑定数据,增删改后实时更新TreeView/ListView

    WPF的界面的确好看,也引入了很多新功能,和winform相比更先进更强大......那么狗儿蛋,代价是什么? 代价就是WPF学起来比较费力。 数据绑定是WPF的特色之一,可以省去写代码更新UI界面的工作。这次打算做一个管理数据的小软件,自然的我也打算在界面上弄个TreeView,然后把

    2024年02月09日
    浏览(39)
  • WPF事件绑定到Command命令

    第一步: 第二步: 第三步: 如果有问题请及时留言,仅供学习~谢谢.

    2024年02月15日
    浏览(29)
  • WPF MVVM基础教程(三)命令/事件的绑定

    除了数据绑定,mvvm中更重要的另一块就是命令和事件的绑定,wpf中关于按钮 Button 、菜单项 MenuItem 等关于点击交互的事件,可以通过命令 Command 在ViewModel 中实现。 示例:在Button上绑定命令 在ViewModel中添加命令和具体执行的内容 在Button上进行绑定 运行: 执行后: 在 Button

    2024年02月09日
    浏览(33)
  • 关于WPF中Command绑定传参数以及将命令绑定到其它事件的方法

    前言:在WPF中,将命令绑定到一个Button的Command属性中是非常简单的事情,例如: 但是很多时候,我们要实现其它事件的命令绑定,以此实现彻底的MVVM开发模式,那就得用到微软另外一个神器了!它就是程序集System.Windows.Interactivity,在网上可以下载System.Windows.Interactivity.dll这

    2024年02月11日
    浏览(28)
  • WPF中TextBox使用KeyBinding绑定命令,键盘事件

        最近在做一个扫码枪识别条形码的功能,TextBox文本按回车键或者是扫码枪识别条形码自动触发查询功能,由于架构采用的是MVVM的开发模式,所以,刚开始采用KeyBinding的方式绑定命令,然后实现该功能;代码如下: 对应的ViewModel中绑定命令事件,代码如下所示     初步

    2024年02月14日
    浏览(35)
  • python异步切片下载文件(内置redis获取任务 mongo更新任务状态等)

    异步切片下载二进制文件并上传桶删除本地文件 部分代码来源于y小白的笔记

    2024年01月19日
    浏览(84)
  • WPF中Binding使用StringFormat格式化字符串方法

    货币格式 货币格式,一位小数 前文字 后文字 固定的位数,位数不能少于未格式化前,仅支持整形 指定小数点后的位数 用分号隔开的数字,并指定小数点后的位数 格式化百分比 占位符 日期/时间 或者 多重绑定 多重绑定中的特殊字符

    2024年02月15日
    浏览(26)
  • 工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据绑定

    工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据绑定。 除了两个柱状图用的第三方开源控件,其他都是原生自己写的,非常适合初学者熟悉语法、事件、触发器、MVVM 机制、布局容器,方便二次开发和修改 工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据

    2024年02月20日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包