kanzi3.6.10 窗口插件-查找绑定信息

embedded/2024/12/26 14:26:38/

文章目录

  • 1. 创建kanzi窗口插件
  • 2. 业务逻辑
  • 3. 关键代码
    • 3.1 遍历本工程的绑定信息
    • 3.2 遍历所有工程的绑定信息
    • 3.3 DiguiSearchNode实现
    • 3.4 双击跳转
  • 4. 安装

背景:在kanzi studio里按Ctrl+F,可以查找,能查找节点/资源等等,但是不能查找绑定信息,十分的不方便。
所以做一个窗口插件,能够查询节点的绑定属性和绑定代码逻辑,甚至可以跨工程查询。

kanzi_6">1. 创建kanzi窗口插件

参考kanzi帮助文档创建窗口插件
在这里插入图片描述

按照帮助文档,一步步建立窗口插件工程。这里不一一赘述。
在这里插入图片描述

  • Class1.cs里包含kanzi窗口插件
  • UserControl1.xaml.cs 是wpf窗口
public partial class UserControl1 : UserControl, PluginWindow

2. 业务逻辑

插件窗口通过studio来遍历所有场景节点和预设件节点,获取节点的绑定信息,
将查询字符串与绑定属性/绑定代码比较,来判断是否查询正确,
将查询信息更新到表格中。
双击表格中某一行,会通过studio.Commands.SelectProjectItems选择对应的节点,让焦点跳过去。

3. 关键代码

3.1 遍历本工程的绑定信息

private void Button_Click(object sender, RoutedEventArgs e){SearchType = 1;// 清空 datagridthis.datagrid.Items.Clear();if (this.studio.ActiveProject == null) return;if (this.searchText.Text.Length <= 0) return;projectName = this.studio.ActiveProject.Name;{//item name, path, bind number                // 遍历获取的绑定项Project activeProject = this.studio.ActiveProject;Screen screen = activeProject.Screen;if (screen != null){Node2D rootNode2D = screen.RootNode2D;if(rootNode2D != null){DiguiSearchNode(rootNode2D);}}PrefabLibrary prefabLibrary = activeProject.PrefabLibrary;if(prefabLibrary != null){// 遍历预制体库foreach (var item in prefabLibrary.Items){var rootNode = item.RootNode;DiguiSearchNode(rootNode);}  }                }}

3.2 遍历所有工程的绑定信息

private void Button_Click_1(object sender, RoutedEventArgs e){SearchType = 2;// 清空 datagridthis.datagrid.Items.Clear();if (this.searchText.Text.Length <= 0) return;var pIndex = 0;foreach (var project in this.studio.Solution.Projects){projectName = project.Name;projectIndex = pIndex;{//item name, path, bind number                // 遍历获取的绑定项Project activeProject = project;Screen screen = activeProject.Screen;if (screen != null){Node2D rootNode2D = screen.RootNode2D;if (rootNode2D != null){DiguiSearchNode(rootNode2D);}}PrefabLibrary prefabLibrary = activeProject.PrefabLibrary;if (prefabLibrary != null){// 遍历预制体库foreach (var item in prefabLibrary.Items){var rootNode = item.RootNode;DiguiSearchNode(rootNode);}}}pIndex++;}}

3.3 DiguiSearchNode实现

private void DiguiSearchNode(Node node){// if (item.Name.Contains(this.searchText.Text)){// 假设 item 是 BindItem 类型var bindingHost = node as BindingHost;var number = 0;if (bindingHost!= null){number = bindingHost.Bindings.Count();for (int i = 0; i < number; i++){var currentBind = bindingHost.Bindings.ToList()[i];if (currentBind.Property.Name.IndexOf(this.searchText.Text, StringComparison.OrdinalIgnoreCase) >= 0|| currentBind.Code.IndexOf(this.searchText.Text, StringComparison.OrdinalIgnoreCase) >= 0){this.datagrid.Items.Add(new BindItem{ProjectIndex = projectIndex,ProjectName = projectName,Name = node.Name,Path = node.Path,BindNumber = i,BindPropertyName = currentBind.Property.Name,BindCode = currentBind.Code,item = node});}}}}foreach (var child in node.ChildNodes){DiguiSearchNode(child);}}

3.4 双击跳转

private void datagrid_MouseDoubleClick(object sender, MouseButtonEventArgs e){try{if (datagrid.SelectedItem != null){var selectedItem = (BindItem)datagrid.SelectedItem; // 确保你的数据项类型为 BindItem// 确认 selectedItem 的字段在访问前不是 nullif (!string.IsNullOrEmpty(selectedItem.Name) && !string.IsNullOrEmpty(selectedItem.Path)){//this.studio.Log("双击了: " + selectedItem.Name + " " + selectedItem.Path);// 这里可以添加打开详细信息窗口的逻辑PluginCommand c;//this.studio.ExecutePluginCommand("ChangeSelectedItem", new List<ProjectItem> { selectedItem.item } );if(selectedItem.ProjectIndex < this.studio.Solution.Projects.Count()){this.studio.Solution.ActiveProject = this.studio.Solution.Projects.ToList()[selectedItem.ProjectIndex];this.studio.Commands.SelectProjectItems(new List<ProjectItem> { selectedItem.item });}                        }else{this.studio.Log("选中的项目有空字段。");}}else{this.studio.Log("没有选中任何项。");}}catch (InvalidCastException ex){// 捕获类型转换异常this.studio.Log("类型转换错误: " + ex.Message);}catch (NullReferenceException ex){// 捕获空引用异常this.studio.Log("空引用错误: " + ex.Message);}catch (Exception ex){// 捕获所有其他异常this.studio.Log("发生了未知错误: " + ex.Message);}}

4. 安装

编译后的dll文件需要拷贝到kanzi安装目录下的plugins文件夹下,重启kanzi,在菜单栏点击插件,打开插件窗口
搜索栏输入text,点Find In Project,可以查询到本工程绑定信息里有text的所有节点,双击自动跳转到这一个节点
在这里插入图片描述

搜索栏输入text,点Find In Projects,可以查询到所有工程绑定信息里有text的所有节点,双击自动跳转到这一个节点
如果双击最后一行,会跳转到第二个引用工程,跨工程跳转,会导致插件窗口关闭,重新打开即可。
在这里插入图片描述


http://www.ppmy.cn/embedded/148914.html

相关文章

光谱相机在农业中的具体应用案例

作物生长监测与产量预测 美国爱荷华州玉米种植园&#xff1a;农场主使用无人机搭载高光谱相机&#xff0c;定期对玉米田进行拍摄。通过分析光谱数据&#xff0c;获取玉米的叶面积指数、叶绿素含量等生长参数。在玉米生长关键期&#xff0c;依据这些参数及时调整施肥和灌溉方案…

如何搭建hapi的FHIR服务器

昨天在CHIMA大讲堂中分享了FHIR的相关内容&#xff0c;重点就是如何搭建一个FHIR服务器 在博客中分享一下当时的搭建hapi FHIR服务器的过程。 1、背景说明 中文网络上讲述如何将开源的hapi FHIR服务器搭建的比较少&#xff08;或者步骤比较简单&#xff0c;不易复现&#xff…

云原生后端开发(一)

云原生后端开发 云原生&#xff08;Cloud-Native&#xff09;是指一种构建和运行应用程序的方式&#xff0c;它充分利用了云计算的特点&#xff0c;比如弹性伸缩、自动化部署、容器化等。在云原生的架构下&#xff0c;后端应用通常具备高度可扩展、可维护、易于自动化管理的特…

【05-数据库面试】

Redo Log&#xff08;重做日志&#xff09;详解 Redo Log 是 MySQL 数据库中 InnoDB 存储引擎特有的一种物理日志&#xff0c;它在数据库的事务处理和数据恢复中扮演着至关重要的角色。本文将从 Redo Log 的基本概念、作用、组成、工作原理以及应用场景等方面进行详细解析。 …

MFC/C++学习系列之简单记录12——文件操作

MFC/C学习系列之简单记录12——文件操作 前言文件操作处理具体使用CFileDialog类 CFile类和CStdioFile类错误总结 前言 学习MFC的文件处理操作&#xff01; 文件操作处理 CFileDialog类&#xff1a;对话框类&#xff0c;获取选择的文件信息。CFile类&#xff1a;抽象类&#…

JavaScript基础与JQuery实践

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:花弄影&#xff0c;月流辉&#xff0c;水晶宫殿五云飞&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注…

苹果手机怎么清理空间:拯救你的拥挤手机

在数字生活的海洋中&#xff0c;我们的苹果手机就像一艘小船&#xff0c;载满了照片、应用、视频和各种下载的“宝贝”。随着时间的推移&#xff0c;这艘小船开始变得拥挤&#xff0c;航行速度放缓&#xff0c;甚至有时候直接卡壳。苹果手机怎么清理空间&#xff1f;是时候学会…

jQuery表格搜索过滤和单元格高亮插件

jQuery.FilterTable是一款表格搜索过滤和单元格高亮插件。该插件允许你对任意表格进行条件过滤&#xff0c;并且它会将搜索到的结果单元格高亮显示&#xff0c;非常实用和强大。 在线预览 下载 使用方法 在页面中引入jquery和jquery.filtertable文件。 <script src"…