用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.rhkb.cn/news/157870.html

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

相关文章

allure测试报告生成逻辑--解决在Jenkins里打开allure报告页面后空白显示无数据问题(以window环境为例)

前言 相信大家在用Jenkins持续集成+ant自动构建+jmeter接口测试+pytest代码.xml文件转化+allure测试报告为一体的接口自动化测试构建过程中,都会遇到Jenkins里打开allure报告页面后空白显示无数据问题这一现象级问题,今天Darren洋就给大家分享一下如何讲讲allure测试报告生成…

【(数据结构) —— 顺序表的应用-通讯录的实现】

&#xff08;数据结构&#xff09;—— 顺序表的应用-通讯录的实现 一.通讯录的功能介绍1.基于动态顺序表实现通讯录(1). 功能要求(2).重要思考 二. 通讯录的代码实现1.通讯录的底层结构(顺序表)(1)思路展示(2)底层代码实现(顺序表&#xff09; 2.通讯录上层代码实现(通讯录结构…

angular项目指定端口,实现局域网内ip访问

直接修改package.json文件 "dev": "ng serve --host 0.0.0.0 --port 8080"终端运行npm run dev启动项目。 这里就指定了使用8080端口运行项目&#xff0c;同时局域网内的其他电脑可以通过访问运行项目主机的ip来访问项目 例如项目运行在ip地址为192.168.2…

ChatGPT角色扮演教程,Prompt词分享

使用指南 1、可直复制使用 2、可以前往已经添加好Prompt预设的AI系统测试使用 https://ai.idcyli.comhttps://ai.idcyli.com 雅思写作考官 我希望你假定自己是雅思写作考官&#xff0c;根据雅思评判标准&#xff0c;按我给你的雅思考题和对应答案给我评分&#xff0c;并且按…

[科研琐事] 安装服务器到机柜的二三事

1. 机柜参数 宽度&#xff1a;一般机器都是符合的&#xff1b; 深度&#xff1a;对应服务器最长的那个边&#xff1b; 厚度&#xff08;高度&#xff09;&#xff1a;1/2/3/4U&#xff0c;就是机柜上写的刻度数字&#xff0c;1U1.75英寸。 1U4.45cm 2U4.45cm * 2 3U4.45cm * …

【踩坑】hive脚本笛卡尔积严重降低查询效率问题

前一阵子查看我们公司的大数据平台的离线脚本运行情况, 结果发现有一个任务居然跑了一天多, 要知道这还只是几千万量级的表, 且这个任务是每天需要执行的 于是我把hive脚本捞出来看了下, 发现无非多join了几个复杂的子查询, 应该不至于这么久, 包括我又检查了是不是没有加上每…

微信小程序 在bindscroll事件中监听scroll-view滚动到底

scroll-view其实提供了一个 bindscrolltolower 事件 这个事件的作用是直接监听scroll-view滚动到底部 但是 总有不太一样的情况 公司的项目 scroll-view 内部 最下面有一个 类名叫 bottombj 的元素 我希望 滚动到这个 bottombj 上面的时候就开始加载滚动分页 简单说 bottombj这…

dockerfile 搭建lnmp+wordpress,docker-compose搭建lnmp+wordpress

目录 dockerfile 搭建lnmpwordpress 部署nginx&#xff08;容器IP 为 172.18.0.10&#xff09; 部署mysql&#xff08;容器IP 为 172.18.0.20&#xff09; 部署php&#xff08;容器IP 为 172.18.0.30&#xff09; docker-compose搭建lnmpwordpress dockerfile 搭建lnmpword…

TCP/IP(十一)TCP的连接管理(八)socket网络编程

一 socket网络编程 socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close 说明: 本文需要C语言、syscall系统调用、OS 操作系统基础理论,如果不了解可以暂时跳过目标&#xff1a; 知道对应库函数的更底层机制思考&#xff1a; socket函数与FIN、A…

VSCode怎么创建Java项目

首先安装好Java的开发环境&#xff1a;JDK在VSCode中安装适用于Java开发的插件。打开VSCode&#xff0c;点击左侧的扩展图标&#xff0c;搜索并安装Java Extension Pack插件。等待安装完成后&#xff0c;重启VSCode生效。创建一个新的Java项目&#xff0c;按下Ctrl Shift P&a…

微软和OpenAI正在开发AI芯片, 并计划下个月发布

今年初&#xff0c;Chat**引起了无数网友关注&#xff0c;一度成为了热门话题。这是由人工智能研究实验室OpenAI开发的一款聊天机器人模型&#xff0c;也称为一种人工智能&#xff08;AI&#xff09;技术驱动的自然语言处理工具。能够通过学习和理解人类的语言来进行对话&#…

[华为杯研究生创新赛 2023] 初赛 REV WP

前言 一年没打比赛了, 差一题进决赛, REV当时lin的第三个challenge没看出来是凯撒, 想得复杂了, 结果错失一次线下机会 >_< T4ee 动态调试, nop掉反调试代码 发现处理过程为 置换sub_412F20处理(这里看其他师傅的wp知道应该是rc4, 我是直接en逆的buf字符串中每一位和…

text-stroke描边

text-stroke 描边 css 代码 设置基础的样式 -webkit-text-stroke使用webkit内核设置文字描边效果&#xff0c;当文字为透明或者是其它颜色都可以由相同的效果 body {background: linear-gradient(to right, #f3f344, #fd8b18, #f13d39, #90108f); }.out {position: relative;…

专业音视频领域中,Pro AV的崛起之路

编者按&#xff1a;在技术进步的加持下&#xff0c;AV行业发展得如何了&#xff1f;本文采访了两位深耕于广播电视行业的技术人&#xff0c;为我们介绍了专业音视频的进展&#xff1a;一位冉冉升起的新星&#xff1a;Pro AV以及FPGA在其中发挥的作用。 美国&#xff0c;拉斯维加…

【Java学习之道】GUI开发的基本概念

引言 在这一章&#xff0c;我们将一起走进Java的图形用户界面&#xff08;GUI&#xff09;开发的世界。在你阅读完这篇文章后&#xff0c;你将能够了解什么是GUI&#xff0c;以及如何使用Java进行GUI的开发。 一、什么是GUI 首先&#xff0c;让我们来解答一个许多初学者都会…

001flutter基础学习

flutter基础学习 参考:https://book.flutterchina.club/chapter1/flutter_intro.html Flutter是谷歌的移动UI框架跨平台: Linux,Android, IOS,Fuchsia原生用户界面:它是原生的,让我们体验更好,性能更好开源免费&#xff1a;完全开源,可以进行商用Flutter与主流框架的对比 Cor…

BI工具:让数据分析井然有序一望而知

BI&#xff08;Business Intelligence&#xff09;工具是一类专门用于数据分析和决策支持的软件工具。 它们能够将企业内部和外部的数据进行整合、处理和可视化&#xff0c;帮助用户从海量数据中获取有价值的见解和洞察&#xff0c;并以直观、易懂的方式展示给决策者和相关人员…

centos离线安装telnet、traceroute工具

安装包下载地址 安装包下载地址在这里 直接输入包名&#xff0c;筛选系统&#xff0c;根据自己系统版本确定该下哪个包 centos离线安装telnet 准备三个安装包 xinetd-2.3.15-14.el7.x86_64.rpmtelnet-server-0.17-65.el7_8.x86_64.rpmtelnet-0.17-65.el7_8.x86_64.rpm 三个…

开源数据库MySQL 8.0 OCP认证精讲视频、环境和题库 之三 选项、变量

选项文件&#xff1a;默认/etc/my.cnf 可以通过以下选项&#xff0c;指定选项文件&#xff1a; -defaults-file&#xff1a;指定选项文件 例如:mysql--defaults-file/etc/my.cnf -no-defaults&#xff1a;不读任何选项文件&#xff0c;所有选项需要在命令行中指定 -defaults-ex…

CVE-2020-9483 apache skywalking SQL注入漏洞

漏洞概述 当使用H2 / MySQL / TiDB作为Apache SkyWalking存储时&#xff0c;通过GraphQL协议查询元数据时&#xff0c;存在SQL注入漏洞&#xff0c;该漏洞允许访问未指定的数据。 Apache SkyWalking 6.0.0到6.6.0、7.0.0 H2 / MySQL / TiDB存储实现不使用适当的方法来设置SQL参…