Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入(一)

article/2025/7/28 2:46:35

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的选项:

Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入

启用或禁用SSR(服务器端呈现)或SSG(静态站点生成)。对于小型应用程序,我更喜欢SSG,来避免持续的网络流量:

Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入

等待安装完成:

Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入

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应用。(下期见......)


http://www.hkcw.cn/article/uZUvNuectb.shtml

相关文章

深入浅出程序设计竞赛(洛谷基础篇) 第十四章 搜索

文章目录 前言例14-1 四阶数独前置知识&#xff1a; 例14-2八皇后例14-3 kkksc03考前临时抱佛脚例14-4 马的遍历前置知识 例14-5 奇怪的电梯例14-6 Meteor Shower S习题14-1.1 选数例14-1 四阶数独前置知识&#xff1a; 例14-2八皇后例14-3 kkksc03考前临时抱佛脚例14-4 马的遍…

图书管理系统的设计与实现

湖南软件职业技术大学 本科毕业设计(论文) 设计(论文)题目 图书管理系统的设计与实现 学生姓名 学生学号 所在学院 专业班级 毕业设计(论文)真实性承诺及声明 学生对毕业设计(论文)真实性承诺 本人郑重声明:所提交的毕业设计(论文)作品是本人在指导教师的指导下,独…

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤

在Java开发的世界里&#xff0c;选择一个强大的集成开发环境&#xff08;IDE&#xff09;是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面&#xff0c;帮助无数开发者快速构建和部署Java项目…

医疗IT系统绝缘监测及故障定位,绝缘监测技术在医院关键区域的应用

医院作为重要的公共设施&#xff0c;其供配电系统的可靠性和安全性直接关系到患者的生命安全。为确保医院电力系统的稳定&#xff0c;GB/T 16895.24《建筑物电气装置》对医疗场所按用电的安全等级进行了细致的分类&#xff0c;并针对不同的类别推荐相应的电力系统配置。其中&am…

进程间通信及管道(理论)

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 什么是管道 匿名管道 实例代码 用fork来共享管道原理 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区别 命名管道的打开规则 进程间通信介绍 进程间通信目的 数据传输&#…

如何安全地清洁 Windows10/11PC上的SSD驱动器

“我在 Windows 10 电脑上安装了新的 SSD&#xff0c;我要删除旧的 SSD 驱动器。但我不知道如何清洁电脑上的 SSD 驱动器。我想清除其中的所有内容。” 那么&#xff0c;您想知道如何在 Windows 10/11 PC 上清洁 SSD 驱动器吗&#xff1f;也许您只是想释放宝贵的空间并提高性能…

换ip是换网络的意思吗?怎么换ip地址

在数字化时代&#xff0c;IP地址作为我们在网络世界的"身份证"&#xff0c;其重要性不言而喻。许多人常将"换IP"与"换网络"混为一谈&#xff0c;实际上两者虽有联系却存在本质区别。本文将澄清这一概念误区&#xff0c;并详细介绍多种更换IP地址…

智能化能源管理系统在“双碳”背景下的新价值

安科瑞刘鸿鹏 摘要 2022年已并网的储能项目中,用户侧并网占比为8.36%,其中工商业储能规模为占比为98.6%。随着各省市的峰 谷价差拉大,部分省市可实现两充两放,工商业储能会更 加具有经济性,加上限电政策的影响,工商业储能将在 2023-2025年逐渐发展成主要的增长点&#xff…

带sdf 的post sim 小结

1.SDF文件主要内容 Delays&#xff08;module&#xff0c;device&#xff0c;interconnect&#xff0c;port&#xff09; Timing checks&#xff08;setup&#xff0c;hold&#xff0c;setuphold&#xff0c;recovery&#xff0c;removal&#xff0c;recrem&#xff09; Timing…

《JavaScript高级程序设计》读书笔记 34 - 代理基础

感谢点赞、关注和收藏! 上一篇类,这一篇进入书的第 9 章 - 代理与反射,首先是代理基础。 代理基础 代理是目标对象的抽象。从很多方面看,代理类似 C++指针,因为它可以用作目标对象的替身,但又完全独立于目标对象。目标对象既可以直接被操作,也可以通过代理来操…

《计算机仿真》——引领计算机仿真领域的学术前沿

期刊名称&#xff1a;计算机仿真 (Computer Simulation) 主办单位&#xff1a;中国航天科工集团公司第十七研究所 出版周期&#xff1a;月刊 出版地&#xff1a;北京市 语种&#xff1a;中文 开本&#xff1a;大16开 ISSN&#xff1a;1006-9348 CN&#xff1a;11-3724/TP 邮发代…

java-文件IO

文件IO 操作系统有一个专门的模块-文件系统&#xff0c;来管理文件。并提供了 api 供我们使用。 文件系统 使用 N叉树 来组织文件。 操作系统使用 “路径” 来描述文件的位置。路径的表示又分为 绝对路径 和 相对路径 绝对路径 &#xff1a;从树的的根节点&#xff08;Wind…

数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(上)

1. 数据金字塔的千年进化史 1.1 从地窖到云端的存储革命 某家电企业在2010年遭遇库存危机时&#xff0c;市场部门需要三天才能从纸质单据中统计出全国滞销型号。当他们的数据工程师在2023年轻声唤醒对话式分析机器人&#xff0c;同样的需求响应时间缩短至9秒。 数据分层架构的…

【MySQL】事务及隔离性

目录 一、什么是事务 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;事务的四大属性 &#xff08;三&#xff09;事务的作用 &#xff08;四&#xff09;事务的提交方式 二、事务的启动、回滚与提交 &#xff08;一&#xff09;事务的启动、回滚与提交 &am…

秒出PPT正式改名秒出AI,开启AI赋能新体验!

在现代办公环境中&#xff0c;借助智能工具提升工作效率已经成为趋势。秒出AI作为一款集AI PPT制作、动画、巨幕、视频、设计以及智能简历功能于一体的综合办公平台&#xff0c;为用户提供一站式智能内容生成解决方案&#xff0c;极大地简化了内容创作流程。 1. AI驱动的一键P…

白皮精读:214页数据安全治理白皮书6.0【附全文阅读】

《数据安全治理白皮书6.0》由中关村网络安全与信息化产业联盟数据安全治理专业委员会编著&#xff0c;北京安华金和科技有限公司参与。数据安全治理在数字化时代至关重要&#xff0c;关乎组织的生存与发展、个人信息权益保障以及国家的安全与稳定。这份白皮书围绕数据安全治理展…

工商业储能站能量管理系统

Acrel-2000MG 储能能量管理系统是安科瑞专门针对工商业储能 电站研制的本地化能量管理系统&#xff0c;可实现了储能电站的数据采集、数 据处理、数据存储、数据查询与分析、可视化监控、报警管理、统计 报表、策略管理、历史曲线等功能。其中策略管理&#xff0c;支持多种控制…

【JUC】深入解析 JUC 并发编程:单例模式、懒汉模式、饿汉模式、及懒汉模式线程安全问题解析和使用 volatile 解决内存可见性问题与指令重排序问题

单例模式 单例模式确保某个类在程序中只有一个实例&#xff0c;避免多次创建实例&#xff08;禁止多次使用new&#xff09;。 要实现这一点&#xff0c;关键在于将类的所有构造方法声明为private。 这样&#xff0c;在类外部无法直接访问构造方法&#xff0c;new操作会在编译…

智慧健康养老服务与管理实训室建设方案框架:服务流程与管理模式实训

随着智慧健康养老产业的快速发展&#xff0c;构建契合行业需求的实训室成为培养专业人才的关键。智慧健康养老服务与管理实训室建设方案聚焦服务流程与管理模式实训&#xff0c;旨在通过系统化设计&#xff0c;让学习者在仿真场景中掌握智慧健康养老服务的全链条操作与现代化管…

KEIL 编译器高级使用与调试技巧【一】 手工编译、编译选项、预处理分析

一、手工编译bin文件 1.1 KEIL 自带的编译组件 ARM v6编译器&#xff08;Arm Compiler for Embedded&#xff09;包含以下几个工具&#xff1a; armclang 编译器和汇编器&#xff0c;可对 C、C 汇编文件进行编译和汇编 armlink 链接器&#xff0c;用于将目标文件和库文件进…