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

文章目录

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

背景:在kanzi studio里按Ctrl+F,可以查找,能查找节点/资源等等,但是不能查找绑定信息,十分的不方便。

所以做一个窗口插件,能够查询节点的绑定属性和绑定代码逻辑,甚至可以跨工程查询。

1. 创建kanzi窗口插件

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

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

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

2. 业务逻辑

插件窗口通过studio来遍历所有场景节点和预设件节点,获取节点的绑定信息,

将查询字符串与绑定属性/绑定代码比较,来判断是否查询正确,

将查询信息更新到表格中。

双击表格中某一行,会通过studio.Commands.SelectProjectItems选择对应的节点,让焦点跳过去。

3. 关键代码

3.1 遍历本工程的绑定信息

c 复制代码
private void Button_Click(object sender, RoutedEventArgs e)
        {
            SearchType = 1;
            // 清空 datagrid
            this.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 遍历所有工程的绑定信息

c 复制代码
private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            SearchType = 2;
            // 清空 datagrid
            this.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实现

c 复制代码
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 双击跳转

c 复制代码
private void datagrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (datagrid.SelectedItem != null)
                {
                    var selectedItem = (BindItem)datagrid.SelectedItem; // 确保你的数据项类型为 BindItem
                    
                    // 确认 selectedItem 的字段在访问前不是 null
                    if (!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的所有节点,双击自动跳转到这一个节点

如果双击最后一行,会跳转到第二个引用工程,跨工程跳转,会导致插件窗口关闭,重新打开即可。

相关推荐
hez20102 小时前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉5 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫6 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫7 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6258 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902118 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠8 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫10 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech11 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf12 天前
C#摸鱼实录——IoC与DI案例详解
c#