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

打印 上一主题 下一主题

主题 803|帖子 803|积分 2409

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

参考kanzi资助文档创建窗口插件

按照资助文档,一步步建立窗口插件工程。这里不一一赘述。



  • Class1.cs里包含kanzi窗口插件
  • UserControl1.xaml.cs 是wpf窗口
  1. public partial class UserControl1 : UserControl, PluginWindow
复制代码
2. 业务逻辑

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

3.1 遍历本工程的绑定信息

  1. private void Button_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             SearchType = 1;
  4.             // 清空 datagrid
  5.             this.datagrid.Items.Clear();
  6.             if (this.studio.ActiveProject == null) return;
  7.             if (this.searchText.Text.Length <= 0) return;
  8.             projectName = this.studio.ActiveProject.Name;
  9.             {
  10.                 //item name, path, bind number               
  11.                 // 遍历获取的绑定项
  12.                 Project activeProject = this.studio.ActiveProject;
  13.                 Screen screen = activeProject.Screen;
  14.                 if (screen != null)
  15.                 {
  16.                     Node2D rootNode2D = screen.RootNode2D;
  17.                     if(rootNode2D != null)
  18.                     {
  19.                         DiguiSearchNode(rootNode2D);
  20.                     }
  21.                 }
  22.                 PrefabLibrary prefabLibrary = activeProject.PrefabLibrary;
  23.                 if(prefabLibrary != null)
  24.                 {
  25.                     // 遍历预制体库
  26.                     foreach (var item in prefabLibrary.Items)
  27.                     {
  28.                         var rootNode = item.RootNode;
  29.                         DiguiSearchNode(rootNode);
  30.                     }  
  31.                 }               
  32.             }
  33.         }
复制代码
3.2 遍历所有工程的绑定信息

  1. private void Button_Click_1(object sender, RoutedEventArgs e)
  2.         {
  3.             SearchType = 2;
  4.             // 清空 datagrid
  5.             this.datagrid.Items.Clear();
  6.             if (this.searchText.Text.Length <= 0) return;
  7.             var pIndex = 0;
  8.              foreach (var project in this.studio.Solution.Projects){
  9.                 projectName = project.Name;
  10.                 projectIndex = pIndex;
  11.                 {
  12.                     //item name, path, bind number               
  13.                     // 遍历获取的绑定项
  14.                     Project activeProject = project;
  15.                     Screen screen = activeProject.Screen;
  16.                     if (screen != null)
  17.                     {
  18.                         Node2D rootNode2D = screen.RootNode2D;
  19.                         if (rootNode2D != null)
  20.                         {
  21.                             DiguiSearchNode(rootNode2D);
  22.                         }
  23.                     }
  24.                     PrefabLibrary prefabLibrary = activeProject.PrefabLibrary;
  25.                     if (prefabLibrary != null)
  26.                     {
  27.                         // 遍历预制体库
  28.                         foreach (var item in prefabLibrary.Items)
  29.                         {
  30.                             var rootNode = item.RootNode;
  31.                             DiguiSearchNode(rootNode);
  32.                         }
  33.                     }
  34.                 }
  35.                 pIndex++;
  36.             }
  37.         }
复制代码
3.3 DiguiSearchNode实现

  1. private void DiguiSearchNode(Node node){
  2.             // if (item.Name.Contains(this.searchText.Text))
  3.             {
  4.                 // 假设 item 是 BindItem 类型
  5.                 var bindingHost = node as BindingHost;
  6.                 var number = 0;
  7.                 if (bindingHost!= null){
  8.                     number = bindingHost.Bindings.Count();
  9.                     for (int i = 0; i < number; i++)
  10.                     {
  11.                         var currentBind = bindingHost.Bindings.ToList()[i];
  12.                         if (currentBind.Property.Name.IndexOf(this.searchText.Text, StringComparison.OrdinalIgnoreCase) >= 0
  13.     || currentBind.Code.IndexOf(this.searchText.Text, StringComparison.OrdinalIgnoreCase) >= 0)
  14.                         {
  15.                             this.datagrid.Items.Add(new BindItem
  16.                             {
  17.                                 ProjectIndex = projectIndex,
  18.                                 ProjectName = projectName,
  19.                                 Name = node.Name,
  20.                                 Path = node.Path,
  21.                                 BindNumber = i,
  22.                                 BindPropertyName = currentBind.Property.Name,
  23.                                 BindCode = currentBind.Code,
  24.                                 item = node
  25.                             });
  26.                         }
  27.                     }
  28.                 }
  29.                
  30.             }
  31.             foreach (var child in node.ChildNodes)
  32.             {
  33.                 DiguiSearchNode(child);
  34.             }
  35.         }
复制代码
3.4 双击跳转

  1. private void datagrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
  2.         {
  3.             try
  4.             {
  5.                 if (datagrid.SelectedItem != null)
  6.                 {
  7.                     var selectedItem = (BindItem)datagrid.SelectedItem; // 确保你的数据项类型为 BindItem
  8.                     
  9.                     // 确认 selectedItem 的字段在访问前不是 null
  10.                     if (!string.IsNullOrEmpty(selectedItem.Name) && !string.IsNullOrEmpty(selectedItem.Path))
  11.                     {
  12.                         //this.studio.Log("双击了: " + selectedItem.Name + " " + selectedItem.Path);
  13.                         // 这里可以添加打开详细信息窗口的逻辑
  14.                         PluginCommand c;
  15.                         //this.studio.ExecutePluginCommand("ChangeSelectedItem", new List<ProjectItem> { selectedItem.item } );
  16.                         if(selectedItem.ProjectIndex < this.studio.Solution.Projects.Count())
  17.                         {
  18.                             this.studio.Solution.ActiveProject = this.studio.Solution.Projects.ToList()[selectedItem.ProjectIndex];
  19.                             this.studio.Commands.SelectProjectItems(new List<ProjectItem> { selectedItem.item });
  20.                         }                        
  21.                     }
  22.                     else
  23.                     {
  24.                         this.studio.Log("选中的项目有空字段。");
  25.                     }
  26.                 }
  27.                 else
  28.                 {
  29.                     this.studio.Log("没有选中任何项。");
  30.                 }
  31.             }
  32.             catch (InvalidCastException ex)
  33.             {
  34.                 // 捕获类型转换异常
  35.                 this.studio.Log("类型转换错误: " + ex.Message);
  36.             }
  37.             catch (NullReferenceException ex)
  38.             {
  39.                 // 捕获空引用异常
  40.                 this.studio.Log("空引用错误: " + ex.Message);
  41.             }
  42.             catch (Exception ex)
  43.             {
  44.                 // 捕获所有其他异常
  45.                 this.studio.Log("发生了未知错误: " + ex.Message);
  46.             }
  47.         }
复制代码
4. 安装

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

搜刮栏输入text,点Find In Projects,可以查询到所有工程绑定信息里有text的所有节点,双击主动跳转到这一个节点
假如双击末了一行,会跳转到第二个引用工程,跨工程跳转,会导致插件窗口关闭,重新打开即可。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表