Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入(一)
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Kendo UI、UI for ASP.NET AJAX、UI for WPF、UI for Xamarin、Reporting等众多控件。
在这篇文章中,我们将演示如何在Telerik UI for WinForms应用程序中使用Kendo UI for Angular组件。您将了解其中的陷阱,以及如何从WinForms实现与Angular的通信,并从Angular获取事件。
Telerik 2025 Q1最新正式版下载
有几种情况可以应用此方法:
- 开始从传统的WinForms应用程序迁移到Angular
- 本地资源集成(本地数据库和其他WinForms资源)
- 在复杂的WinForms应用程序中构建轻量级UI应用程序
- 构建具有Web应用程序外观和感觉的WinForms应用程序
- 执行在Docker、IIS或Cloud中运行的分布式UI
- 无需更新WinForms应用程序客户端应用程序即可更新UI
这些来自遗留应用程序的转换场景可以帮助您在开发新的服务/应用程序时使用激活的生产资源,混合解决方案可以保留当前的WinForms,同时授权开发人员构建客户端应用程序。
入门指南
要复制这个示例,您必须创建一个WinForms应用和一个Angular项目来承载所需的控件。如果正在集成一个旧的WinForms应用,只需要创建Angular项目。
在终端提示符上安装最新版本的Angular:
npm install -g @angular/cli.
进入目标目录,例如C:\Telerik,并创建新项目:
ng new my-app
选择CSS的选项:
启用或禁用SSR(服务器端呈现)或SSG(静态站点生成)。对于小型应用程序,我更喜欢SSG,来避免持续的网络流量:
等待安装完成:
Kendo UI for Angular App
按照以下步骤配置和使用来自WinForms的控件。
我们将使用Kendo UI,特别是Kendo UI for Angular饼图控件。在创建图表及其功能之前,安装它以便应用程序可以访问它。在my-app项目的根目录下,输入这个安装命令:
ng add @progress/kendo-angular-charts
这个命令为我们做了很多事情(比如安装图表及其依赖项),现在将kendo-angular-charts添加到main中,有必要创建页面和组件主机,并添加接口和CustomEvent来返回数据。
1. 开始使用喜欢的控件创建页面,生成一个名为graph-control的angular组件来存放这些组件,graph-control将承载Angular图表组件:
ng g c graph-control
2. 将新组件添加到app.routes.ts中,即组件所在页面的路由:
import { Routes } from '@angular/router';
import { GraphControlComponent } from './graph-control/graph-control.component';export const routes: Routes = [
{
path: 'graph-control',
component: GraphControlComponent
}
];
3. 使用命令行创建组件来承载控件,在这个示例中,我们目前只演示了图表组件:
ng g c win-chart
4. 自定义控件。
添加将用于交换与WinForms集成的数据(receiveData)的接口,您可以添加多个接口来传输数据:
1. declare global {
2. interface Window {
3. receiveData: (data: any) => void;
4. }
5. }
现在在WinChart组件中,需要创建一个公共的winFormsData: any = null; 变量来保存数据。
5. 接下来,让我们结合本地存储来保存数据。可以用它来存储页面刷新之间的数据,在init函数中,可以从本地存储中获取数据并更新winFormsData值(如果savedData存在)。
1. public winFormsData: any = null;
2. constructor() {
3. window.receiveData = (data: any) => {
4. this.winFormsData = data;
5. localStorage.setItem('winFormsData', JSON.stringify(data));
6. };
7. }
8.
9. ngOnInit() {
10. const savedData = localStorage.getItem('winFormsData');
11. if (savedData) {
12. this.winFormsData = JSON.parse(savedData);
13. }
14. }
在component.html中为图表添加一个click事件:
1. onSeriesClick(event: SeriesClickEvent): void {
2. const category = event.category;
3. const value = event.value;
4.
5. console.log('Category:', category);
6. console.log('Value:', value);
7.
8. const message = JSON.stringify({ category, value });
9.
10. // Create a new custom event
11. const eventClick = new CustomEvent('MyClick', {
12. detail: { message: message }, // Pass any necessary data
13. });
14.
15. window.dispatchEvent(eventClick);
16. }
提示:这是一个陷阱;注意您将返回的JSON。错误的JSON格式会导致交付崩溃:
1. const message = JSON.stringify({ category, value });
从win-chart.component.html中删除默认的HTML,继续添加一个Kendo UI Chart,它将使用我们刚刚创建的系列点击。
1. <div *ngIf="winFormsData === null">Loading....</div>
2. // check the var winFormsData
3.
4. <div *ngIf="winFormsData !== null">
5. <kendo-chart
6. (seriesClick)="onSeriesClick($event)">
7. <kendo-chart-title
8. color="black"
9. font="12pt sans-serif"
10. text="WinForms x Angular - Data integration"
11. >
12. </kendo-chart-title>
13. <kendo-chart-legend position="top"></kendo-chart-legend>
14. <kendo-chart-series>
15. <kendo-chart-series-item
16. [data]="winFormsData"
17. [labels]="{ visible: true, content: label}"
18. [type]="typeChart"
19. categoryField="name"
20. colorField="color"
21. field="value">
22. </kendo-chart-series-item>
23. </kendo-chart-series>
24. </kendo-chart>
25. </div>
在图形控件页面上,添加要绑定的HTML:
1. <app-win-chart></app-win-chart>
为了加快速度,我将提供win-chart.component.ts的完整文件:
1. import { Component } from '@angular/core';
2. import { ChartsModule, LegendLabelsContentArgs, SeriesClickEvent, SeriesType } from "@progress/kendo-angular-charts";
3. import { CommonModule } from '@angular/common';
4.
5. declare global {
6. interface Window {
7. receiveData: (data: any) => void;
8. }
9. }
10.
11. @Component({
12. selector: 'app-win-chart',
13. standalone: true,
14. imports: [ChartsModule, CommonModule],
15. templateUrl: './win-chart.component.html',
16. styleUrls: ['./win-chart.component.css']
17. })
18. export class WinChartComponent {
19. public winFormsData: any = null;
20. public typeChart: SeriesType = "pie";
21.
22. constructor() {
23. window.receiveData = (data: any) => {
24. this.winFormsData = data;
25. localStorage.setItem('winFormsData', JSON.stringify(data));
26. };
27. }
28.
29. ngOnInit() {
30. const savedData = localStorage.getItem('winFormsData');
31. if (savedData) {
32. this.winFormsData = JSON.parse(savedData);
33. }
34. }
35.
36. public label(args: LegendLabelsContentArgs): string {
37. return `${args.dataItem.name}`;
38. }
39.
40. onSeriesClick(event: SeriesClickEvent): void {
41. const category = event.category;
42. const value = event.value;
43.
44. console.log('Category:', category);
45. console.log('Value:', value);
46.
47. const message = JSON.stringify({ category, value });
48.
49. // Create a new custom event
50. const eventClick = new CustomEvent('MyClick', {
51. detail: { message: message }, // Pass any necessary data
52. });
53.
54. window.dispatchEvent(eventClick);
55. }
56.
57. }
现在Angular应用已经准备好了,接下来我们将继续介绍如何使用WinForms应用。(下期见......)
相关文章:

Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入(一)
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Kendo…...

古老的传说(Player、Stage)是否还能在蓝桥云课ROS中重现-250601(失败)
古老的传说是否还能在蓝桥云课ROS中重现-250601 经典复现何其难,百分之二就凉凉! 古老的传说 那是很久很久以前的故事……上个世纪的一个机器人项目 Player、Stage这个项目最早起源于1999年,由美国南加州大学机器人研究实验室开发࿰…...

InfluxQL 数据分析实战:聚合、过滤与关联查询全解析
InfluxQL 作为时序数据库的专用查询语言,在处理时间序列数据时展现出独特优势。本文深入探讨 聚合计算、数据过滤和跨测量关联 三大核心操作,通过真实代码示例展示如何从海量时序数据中提取关键洞察。文中涵盖从基础平均值计算到复杂多维度分析的完整流程…...

Qt font + ToolTip + focusPolicy + styleSheet属性(5)
文章目录 font属性API接口直接在Qt Designer编辑图形化界面通过纯代码的方式修改文字属性 ToolTip属性API接口代码演示 focusPolicy属性概念理解API接口通过编辑图形化界面演示 styleSheet属性概念理解通过编辑图形化界面展示代码 图形化界面的方式展示(夜间/日间模…...
APM32主控键盘全功能开发实战教程:软件部分
APM32主控键盘全功能开发实战教程:从零基础到RGB矩阵高级玩法 🔥 前言:随着机械键盘DIY风潮兴起,国产APM32芯片因其高性价比和与STM32的完美兼容性,正逐渐成为键盘开发主控的新宠。本文将手把手带你从最基础的环境搭建…...
docker 部署 gin
编译与执行 ✅「静态编译语言 生成原生二进制文件 操作系统直接执行」 Go 语言之所以在工程部署场景中大受欢迎的核心优势:它直接编译成原生二进制可执行文件(binary executable)。 🔧 Go 是“静态编译语言”(编译型…...

十三: 神经网络的学习
这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。为了使神经网络能进行学习,将导入损失函数这一指标。而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。为了找出尽可能小的损失函数的值,我们将介绍利…...
Qt OpenGL编程常用类
Qt提供了丰富的类来支持OpenGL编程,以下是常用的Qt OpenGL相关类: 一、QOpenGLWidget 功能:用于在 Qt 应用程序中嵌入 OpenGL 渲染的窗口部件。替代了旧版的QGLWidget。提供了OpenGL上下文和渲染表面。 继承关系:QWidget → QOpenGLWidget 属性与方法: QOpenGLWidget 属…...
数据结构 --- 顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改 顺序表分为:静态顺序表、动态顺序表 一.静态顺序表 #define N 7 typedef int SLDataType;typedef struct Seqlist {…...
MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
本文将深入探讨 MySQL 高级查询技巧,重点讲解 GROUP BY、HAVING、各种聚合函数、子查询以及分页查询(LIMIT 语法)的使用。文章内容涵盖实际应用中最常见的报表需求和分页实现技巧,适合有一定 SQL 基础的开发者进一步提升技能。 一…...
无人机多旋翼倾转动力测试系统-适用于(eVTOL开发、缩比模型测试、科研教育)
在倾转旋翼无人机、垂直起降(VTOL)及混合动力飞行器的研发中,动力系统在垂直-水平模式切换时的动态性能至关重要。LY-QZ-F4多旋翼倾转动力测试系统是全球首款专为倾转四旋翼设计的多自由度动力测试平台,融合高精度传感、动态倾转模…...
.NET8入门:14.ASP.NET Core MVC进阶——Model
上一篇文章我们了解了一下MVC在ASP.NET8中的一些基础概念,接下来深入了解一下ASP.NET Core MVC中Model的一些特性和用法。 Model 职责 Model 代表应用程序的核心数据和业务逻辑部分。它负责: 封装业务数据:表示应用程序中的实体,…...
latex figure Missing number, treated as zero. <to be read again>
\begin{figure}[h] \centering \includegraphics[width\linewidth]{pictures/architecture.pdf} \caption{Typical architecture.} \label{fig:architecture} \end{figure}, 我在编译latex,这段代码报错, Missing number, treated …...
java CompletableFuture创建异步任务(Completable异步+ExecutorService线程池)
文章目录 前置自定义线程池使用 CompletableFuture 创建异步任务 前置 来自 import java.util.concurrent.CompletableFuture; 自定义线程池 推荐根据业务需求配置 ExecutorService pool new ThreadPoolExecutor(10, // 核心线程数20, // 最大线程数60L, TimeUnit.SECONDS…...

LeetCode 高频 SQL 50 题(基础版)之 【聚合函数】部分
题目:620. 有趣的电影 题解: select * from cinema where description !boring and id%21 order by rating desc题目:1251. 平均售价 题解: select p.product_id product_id,round(ifnull(sum(p.price*u.units)/sum(u.units),0)…...

【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)
1,介绍 出自论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》,RAG是权宜之计,通过RAG将问题简单化、精简化、剔除噪声,让LLM更容易理解、生成内容。RAG:检索增强技术检索生成(重…...

低成本高效图像生成:GPUGeek和ComfyUI的强强联合
一、时代背景 在如今的数字化时代,图像生成技术正不断发展和演变,尤其是在人工智能领域。无论是游戏开发、虚拟现实,还是设计创意,图像生成已成为许多应用的核心技术之一。然而,随着图像质量需求的提升,生成…...
基于Matlab实现卫星轨道模拟仿真
在IT行业中,卫星轨道模拟和仿真程序是航空航天领域的重要工具,用于预测和分析人造卫星的运动轨迹。 我们需要理解卫星轨道的基本原理。地球引力使得卫星围绕地球运动,形成特定的椭圆或圆形轨道。牛顿的万有引力定律和开普勒的行星运动定律为…...
前端使用 spark-md5 实现大文件切片上传
需要计算文件MD5和、分片MD5: 封装公共方法代码如下: import SparkMD5 from "spark-md5"/*** 计算文件MD5* param file* returns*/ export function calculateFileMD5(file) {return new Promise((resolve) > {const reader new FileRea…...

《操作系统真相还原》——进入内核
ELF 按书上的操作来,在现代操作平台编译链接默认生成elf64 格式的文件, 很显然程序头位置发生变化,因为定义elf 结构的类型中有64位,所以我们需要将编译链接出32位格式的 gcc -m32 -c -o main.o main.c ld -m elf_i386 main.o …...

【QQ音乐】sign签名| data参数 | AES-GCM加密 | webpack(上)
1.目标 网址:https://y.qq.com/n/ryqq/toplist/26 切换榜单出现请求,可以看到sign和data是加密的 2.逆向分析 搜索sign: 可以看到sign P(n.data),而n.data就是请求的加密data参数 data {"comm":{"cv":4747474,&qu…...

【STM32】按键控制LED 光敏传感器控制蜂鸣器
🔎【博主简介】🔎 🏅CSDN博客专家 🏅2021年博客之星物联网与嵌入式开发TOP5 🏅2022年博客之星物联网与嵌入式开发TOP4 🏅2021年2022年C站百大博主 🏅华为云开发…...

M-OFDM模糊函数原理及仿真
文章目录 前言一、M序列二、M-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、m-OFDM 模糊函数②、m-OFDM 距离分辨率③、m-OFDM 速度分辨率④、m-OFDM 等高线图 四、资源自取 前言 本文进行 M-OFDM 的原理讲解及仿真&#x…...

【MySQL】MVCC与Read View
目录 一、数据库并发的三种场景 二、读写场景的MVCC (一)表中的三个隐藏字段 (二)undo 日志 (三)模拟MVCC (四)Read View (五)当前读和快照读 三、RC和…...

相机--双目立体相机
教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera,属于深度相机。 作用 1,获取图像特征; 2,获取图像深度信息; 原理 原理和标定 …...

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现
多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现 目录 多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现效果一览基本介绍…...

工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”
在日常工作里,需求变动或者新增功能是再常见不过的事情了。而面对这种情况时,那些耦合度较高的代码就会给我们带来不少麻烦,因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性,我们在添加新需求时,…...
23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集
一、模型介绍 Qwen2.5-VL 是阿里通义千问团队开源的视觉语言模型,具有3B、7B和72B三种不同规模,能够识别常见物体、分析图像中的文本、图表等元素,并具备作为视觉Agent的能力。 Qwen2.5-VL 具备作为视觉Agent的能力,可以推理并动态使用工具,初步操作电脑和手机。在视频处…...

37. Sudoku Solver
题目描述 37. Sudoku Solver 回溯 class Solution {vector<vector<bool>> row_used;vector<vector<bool>> col_used;vector<vector<bool>> box_used;public:void solveSudoku(vector<vector<char>>& board) {row_used.r…...
C# Renci.SshNet 登陆 suse配置一粒
C# 调用Renci.SshNet 的SSH类库,登陆 suse linux系统,如果没有配置,会报错: Renci.SshNet.Common.SshAuthenticationException: No suitable authentication method found to complete 1、需要root登陆os,配置 /etc/ssh/sshd_con…...