用wpf替代winform 解决PLC数据量过大页面卡顿的问题

winform 由于不是数据驱动, 页面想刷新数据必须刷新控件, wpf则不用. 可以利用wpf 的数据绑定和IOC, 页面中的消息传递, itemscontrol 实现大量数据刷新, 上位机页面不卡顿

跨页面传值, 可以用两种方法: Toolkit.Mvvm中的Message和IOC. 下面是代码:

using Microsoft.Extensions.DependencyInjection;
using NavTest.Eneities;
using NavTest.Views;
using System;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Windows;namespace NavTest
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{public App() => Services = ConfigureServices();public IServiceProvider? Services { get; }public new static App Current => (App)Application.Current;private IServiceProvider? ConfigureServices(){ServiceCollection services = new ServiceCollection();//View#region ViewModel,View 注入services.AddSingleton<NewMainView>();services.AddSingleton<Page1>();services.AddSingleton<Page2>();services.AddSingleton<Page3>();services.AddSingleton<Page5>();var viewModelTypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Name.EndsWith("ViewModel"));foreach (var type in viewModelTypes){services.AddScoped(type);}//services.AddSingleton<Page2>(sp => new Page2()//{//    DataContext = sp.GetService<Page2ViewModel>()//});#endregion//PLC注入services.AddSingleton<PLCModels>();return services.BuildServiceProvider();}private void Application_Startup(object sender, StartupEventArgs e){NewMainView newMainView = this.Services?.GetService<NewMainView>();newMainView.Show();//MainView? mainView = this.Services?.GetService<MainView>();//mainView.DataContext = this.Services?.GetService<MainViewModel>();//mainView.Show();}}
}

模型定义:

using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel;namespace NavTest.Eneities
{public partial class PLCModel : INotifyPropertyChanged{public int Id { get; set; }public string? Name { get; set; }public string? DataType { get; set; }//[ObservableProperty]//private int plcValue;private int plcValue;public event PropertyChangedEventHandler? PropertyChanged;public int PlcValue{get => plcValue;set{if (plcValue != value){plcValue = value;NotifyPropertyChanged(nameof(PlcValue));}}}private void NotifyPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NavTest.Eneities
{public partial class PLCModels{public PLCModels(){for (int i = 0; i < 200; i++){pLCModels.Add(new PLCModel(){Id = i,PlcValue = i,Name = $"名字{i}",});}}public ObservableCollection<PLCModel> pLCModels { get; set; } = new();}
}

主页面产生数据:

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NavTest.Eneities;
using NavTest.Views;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows;namespace NavTest.ViewModels
{public partial class NewMainViewModel : ObservableRecipient{public NewMainViewModel(Page1 page1, Page2 page2, Page3 page3, Page5 page5, PLCModels pLCModelsIoc){this.page1 = page1;this.page2 = page2;this.page3 = page3;this.page5 = page5;this.pLCModelsIoc = pLCModelsIoc;IsActive = true;this.MyContent = page2;PlcGetValue();}[ObservableProperty]private object? myContent;private readonly Page1 page1;private readonly Page2 page2;private readonly Page3 page3;private readonly Page5 page5;private  PLCModels pLCModelsIoc;[ObservableProperty]private ObservableCollection<PLCModel> pLCModels;private int myUshort1;public int MyUshort1{get => myUshort1;set => SetProperty(ref myUshort1, value, true);}[RelayCommand]public void MaxNormor(Window window){window.WindowState =window.WindowState == WindowState.Maximized? WindowState.Normal: WindowState.Maximized;}[RelayCommand]public void SwitchPage(string str){switch (str){case "main"://this.MyContent;break;case "page1":this.MyContent = page1;break;case "page2":this.MyContent = page2;break;case "page3":this.MyContent = page3;break;case "page5":this.MyContent = page5;break;default:break;}}private void PlcGetValue(){Task.Run(async () =>{while (true){await Task.Delay(500);//用Message传递PLCModels = new();for (int i = 0; i < 90; i++){var random = new Random();PLCModels.Add(new(){Id = i,Name = $"Name{i}",PlcValue = random.Next(1, 500)});if (i == 10){MyUshort1 = random.Next(1, 500);}}//用Ioc传递for (int j = 0; j < 200; j++){var random = new Random();pLCModelsIoc.pLCModels[j].PlcValue = random.Next(1, 500);}}});}}
}

用ViewModel的Message 传值:

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
using NavTest.Eneities;
using System.Collections.ObjectModel;namespace NavTest.ViewModels
{/// <summary>/// 用ViewModel 的 Message传递变化的值/// </summary>public partial class Page2ViewModel : ObservableRecipient, IRecipient<PropertyChangedMessage<int>>{[ObservableProperty]private ObservableCollection<PLCModel> pLCModels;public Page2ViewModel(){IsActive = true;}public void Receive(PropertyChangedMessage<int> message){if (message.Sender is NewMainViewModel vm){this.PLCModels = vm.PLCModels;}}}
}
<UserControlx:Class="NavTest.Views.Page2"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:con="clr-namespace:ValueConverters;assembly=ValueConverters"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:hc="https://handyorg.github.io/handycontrol"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:local="clr-namespace:NavTest.Views"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:mv="clr-namespace:NavTest.ViewModels"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:tt="clr-namespace:NavTest.Eneities"xmlns:vc="clr-namespace:NavTest.Components"d:DataContext="{d:DesignInstance mv:Page2ViewModel}"d:DesignHeight="450"d:DesignWidth="800"FontSize="22"mc:Ignorable="d"><Grid><Grid.RowDefinitions><RowDefinition Height="0.1*" /><RowDefinition /></Grid.RowDefinitions><StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"><TextBlock Foreground="White" Text="用viewModel的消息传递" /></StackPanel><ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"><ItemsControl AlternationCount="2" ItemsSource="{Binding PLCModels}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><WrapPanel /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><Border x:Name="border" Padding="2" BorderThickness="2" BorderBrush="Cyan"><StackPanel><TextBlock Foreground="White" Text="{Binding Id}" /><TextBlock Foreground="White" Text="{Binding Name}" /><TextBlock Foreground="White" Text="{Binding PlcValue}" /></StackPanel></Border><DataTemplate.Triggers><Trigger Property="ItemsControl.AlternationIndex" Value="1"><Setter TargetName="border" Property="Background" Value="green" /></Trigger></DataTemplate.Triggers></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></ScrollViewer></Grid></UserControl>

用IOC传值:

using CommunityToolkit.Mvvm.ComponentModel;
using NavTest.Eneities;
using System.Collections.ObjectModel;namespace NavTest.ViewModels
{/// <summary>/// 用Ioc传递变化的值/// </summary>public partial class Page3ViewModel : ObservableObject{public Page3ViewModel(PLCModels pLCModelsIoc){pLCModels = pLCModelsIoc.pLCModels;}[ObservableProperty]private ObservableCollection<PLCModel> pLCModels;}
}
<UserControlx:Class="NavTest.Views.Page3"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:hc="https://handyorg.github.io/handycontrol"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:local="clr-namespace:NavTest.Views"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:mv="clr-namespace:NavTest.ViewModels"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:tt="clr-namespace:NavTest.Eneities"xmlns:vc="clr-namespace:NavTest.Components"d:DataContext="{d:DesignInstance mv:Page3ViewModel}"d:DesignHeight="450"d:DesignWidth="800"FontSize="24"mc:Ignorable="d"><Grid><Grid.RowDefinitions><RowDefinition Height="0.1*" /><RowDefinition /></Grid.RowDefinitions><StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"><TextBlock Foreground="White" Text="用Ioc传递" /></StackPanel><ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"><ItemsControl AlternationCount="2" ItemsSource="{Binding PLCModels}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><WrapPanel /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><Borderx:Name="border"Padding="2"BorderBrush="Yellow"BorderThickness="2"><StackPanel><TextBlock Foreground="White" Text="{Binding Id}" /><TextBlock Foreground="White" Text="{Binding Name}" /><TextBlock Foreground="White" Text="{Binding PlcValue}" /></StackPanel></Border><DataTemplate.Triggers><Trigger Property="ItemsControl.AlternationIndex" Value="1"><Setter TargetName="border" Property="Background" Value="Blue" /></Trigger></DataTemplate.Triggers></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></ScrollViewer></Grid>
</UserControl>

效果图:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

3.2.5:VBA对单元格操作的引申

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

天堂2服务器安装教程

我们在架设游戏的时候很多时候都是摸不着头脑不知道从何下手&#xff0c;只要我们理清思路一步一步的操作步骤是不难的&#xff0c;其中的细节注意到就能成功的架设起来。下面跟大家来说说从哪下手。 首先我们需要有自己的服务器&#xff0c;系统我们就用Windows 2008 Server。…

解锁机器学习-梯度下降:从技术到实战的全面指南

目录 一、简介什么是梯度下降&#xff1f;为什么梯度下降重要&#xff1f; 二、梯度下降的数学原理代价函数&#xff08;Cost Function&#xff09;梯度&#xff08;Gradient&#xff09;更新规则代码示例&#xff1a;基础的梯度下降更新规则 三、批量梯度下降&#xff08;Batc…

MySQL创建数据库、创建表操作和用户权限

1、创建数据库school&#xff0c;字符集为utf8 2、在school数据库中创建Student和Score表 3、授权用户tom&#xff0c;密码Mysql123&#xff0c;能够从任何地方登录并管理数据库school 4、使用mysql客户端登录服务器&#xff0c;重置root密码

JavaScript之正则表达式

详见MDN 正则表达式(RegExp) 正则表达式不是JS独有的内容&#xff0c;大部分语言都支持正则表达式 JS中正则表达式使用得不是那么多&#xff0c;我们可以尽量避免使用正则表达式 在JS中&#xff0c;正则表达式就是RegExp对象&#xff0c;RegExp 对象用于将文本与一个模式匹配 正…

【问题解决】【爬虫】抓包工具charles与pycharm发送https请求冲突问题

问题&#xff1a; 开启charles抓包&#xff0c;运行pycharm发送https请求报以下错误 解决&#xff1a; 修改python代码&#xff0c;发送请求时添加verify false&#xff0c;此时charles也能抓取到pycharm发送的请求 2. 关闭charles抓包&#xff0c;取消勾选window proxy

windows安装nvm以及解决yarn问题

源代码 下载 下一步一下步安装即可 检查是否安装成功 nvm出现上面的代码即可安装成功 常用命令 查看目前安装的node版本 nvm list [available]说明没有安装任何版本&#xff0c;下面进行安装 nvm install 18.14使用该版本 node use 18.14.2打开一个新的cmd输入node -…

Apache Lucene 7.0 - 索引文件格式

Apache Lucene 7.0 - 索引文件格式 文章目录 Apache Lucene 7.0 - 索引文件格式介绍定义反向索引字段类型段文档数量索引结构概述文件命名文件扩展名摘要锁文件 原文地址 介绍 这个文档定义了在这个版本的Lucene中使用的索引文件格式。如果您使用的是不同版本的Lucene&#xf…

vue面试题-应用层

MVC与MVVM MVCMVVM 双向数据绑定 vue2 双向绑定原理 v-model原理 vue3 双向绑定原理 示例 对比 vue2响应式原理和Vue3响应式原理 data为什么是函数?v-if 与 v-show MVC与MVVM MVC和MVVM是两种流行的设计模式&#xff0c;它们都是用于构建动态应用程序的框架。 MVC MVC&#…

【重拾C语言】十一、外部数据组织——文件

目录 前言 十一、外部数据组织——文件 11.1 重新考虑户籍管理问题——文件 11.2 文件概述 11.2.1 文件分类 11.2.2 文件指针、标记及文件操作 11.3 打开、关闭文件 11.4 I/O操作 11.4.1 字符读写 11.4.2 字符串读写 11.4.3 格式化读写 11.4.4 数据块读写 11.4.5 …

【神经网络】如何在Pytorch中从零开始将MNIST网络量化为8位

论文&#xff1a; Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference 下载地址&#xff1a;https://arxiv.org/pdf/1712.05877.pdf 更新:量化感知训练的博客文章是在线的&#xff0c;并在这里链接&#xff0c;通过它我们可以训…

c++可变参数模板

不要做一个清醒的堕落者文章目录 可变参数模板的简介什么是可变参数 模板参数包参数包数据的获取(函数递归获取)参数包的获取(逗号表达式获取) 可变参数的应用emplace 可变参数模板的简介 c11添加的新特性能够让你创建可以接受改变的函数模板和类模板&#xff0c;C98/03&#…

LCR 095. 最长公共子序列(C语言+动态规划)

1. 题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…

权限管理与jwt鉴权

权限管理与jwt鉴权 学习目标&#xff1a; 理解权限管理的需求以及设计思路实现角色分配和权限分配 理解常见的认证机制 能够使用JWT完成微服务Token签发与验证 权限管理 需求分析 完成权限&#xff08;菜单&#xff0c;按钮&#xff08;权限点&#xff09;&#xff0c;A…

最详细STM32,cubeMX 按键点亮 led

这篇文章将详细介绍 如何在 stm32103 板子上使用 按键 点亮一个LED. 文章目录 前言一、如何控制按键&#xff1f;为什么按键要接上拉电阻或者下拉电阻呢&#xff1f; 二、cubeMX配置工程自动生成代码解析 三、读取引脚电平函数四、按键为什么要消抖如何消除消抖 五、实现按键控…

电子笔记真的好用吗?手机上适合记录学习笔记的工具

提及笔记&#xff0c;不少人都会和学习挂钩&#xff0c;的确学习过程中我们经常会遇到很多难题&#xff0c;而经常记录笔记可以有效地帮助大家记住很多知识&#xff0c;而且时常拿出笔记查看一下&#xff0c;可方便巩固过去学习的知识。 手机作为大家日常随身携带的工具&#…

ArcGIS API for Android中针对MapView设置setOnTouchListener监听

在ArcGIS API for Android中,MapView通常只能设置一个OnTouchListener,这意味着你不能直接为同一个MapView对象多次调用setOnTouchListener方法,以添加多个不同的触摸监听器。 如果你需要多个不同的触摸监听器来处理不同类型的触摸事件,通常的做法是在一个OnTouchListener…

如何做系统架构设计

文章目录 1、如何进行架构设计体系架构需求体系架构设计体系架构文档化体系架构复审体系架构实现体系架构演化 2、架构设计注意事项分治原则服务自治拥抱变化可维护性考虑依赖和限制阅读代码注意事项 3、最后 ​系统架构应该如何设计&#xff0c;从自己做架构的经历来分享一些体…

mock

简单使用 在Java中&#xff0c;单元测试是一种测试方法&#xff0c;用于验证代码的各个组件&#xff08;通常是单个方法或类&#xff09;是否按预期工作。在单元测试中&#xff0c;有时需要模拟外部依赖&#xff0c;以确保测试的隔离性。为此&#xff0c;通常会使用模拟测试工…

idea 启动出现 Failed to create JVM JVM Path

错误 idea 启动出现如下图情况 Error launching IDEA If you already a 64-bit JDK installed, define a JAVA_HOME variable in Computer > System Properties> System Settings > Environment Vanables. Failed to create JVM. JVM Path: D:\Program Files\JetB…