ue3dUIToolkit使用MultiColumnTreeView实现多列树视图

UIToolkit使用MultiColumnTreeView实现多列树视图

分类:
ue3d - UIToolkit使用MultiColumnTreeView实现多列树视图

在本文中3D天堂将介绍如何使用Unity的UI Toolkit(工具包)中的MultiColumnTreeView实现多列树视图。

介绍

使用UI Toolkit MutiColumnTreeView,可以创建如下所示的多列树视图,阅读本文的同时可以从这里进行参考。

ue3d - UIToolkit使用MultiColumnTreeView实现多列树视图

单列树视图3D天堂后续会介绍。

创建UXML文件

首先在UXML文件中创建布局,像这样MultiColumnTreeView在其中设置两列

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:MultiColumnTreeView fixed-item-height="20">
        <ui:Columns>
            <ui:Column name="name" title="Name" width="120" />
            <ui:Column name="description" title="Description" width="200" />
        </ui:Columns>
    </ui:MultiColumnTreeView>
</ui:UXML>

另存为editor_layout.uxml

接下来,只要在列表中显示的每个项目创建一个布局,这次只是显示标签

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:Label text="Label" />
</ui:UXML>

然后另存为item_layout.uxml

创建编辑器窗口

然后创建以下EditorWindow脚本,可以为每个单元格生成布局并绑定单元格的内容。

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public sealed class Example : EditorWindow
{
    [SerializeField] private VisualTreeAsset editorLayout;
    [SerializeField] private VisualTreeAsset labelItemLayout;
    private readonly List<TreeViewItemData<Item>> _rootItems = new();

    private void Reset()
    {
        var id = 0;
        for (var i = 0; i < 10; i++)
        {
            // Create a list of child items
            var items = new List<TreeViewItemData<Item>>(10);
            for (var j = 0; j < 10; j++)
            {
                var item = new TreeViewItemData<Item>(id++,
                    new Item { name = $"Item {j}", description = $"Description {j}" });
                items.Add(item);
            }

            // Create a root item and add child items
            var rootItem = new TreeViewItemData<Item>(id++, new Item { name = $"Group {i}" }, items);

            // Add only root item to data source
            _rootItems.Add(rootItem);
        }
    }

    private void CreateGUI()
    {
        editorLayout.CloneTree(rootVisualElement);
        var multiColumnTreeView = rootVisualElement.Q<MultiColumnTreeView>();

        // Set data source
        multiColumnTreeView.SetRootItems(_rootItems);

        var nameColumn = multiColumnTreeView.columns["name"];
        var descriptionColumn = multiColumnTreeView.columns["description"];

        // The process of creating the cell layout
        nameColumn.makeCell = labelItemLayout.CloneTree;
        descriptionColumn.makeCell = labelItemLayout.CloneTree;

        // The process of setting the contents of a cell
        nameColumn.bindCell = (e, i) => e.Q<Label>().text = multiColumnTreeView.GetItemDataForIndex<Item>(i).name;
        descriptionColumn.bindCell = (e, i) =>
            e.Q<Label>().text = multiColumnTreeView.GetItemDataForIndex<Item>(i).description;
    }

    [MenuItem("Window/Example")]
    public static void ShowWindow()
    {
        GetWindow<Example>();
    }

    [Serializable]
    public struct Item
    {
        public string name;
        public string description;
    }
}

执行结果

从菜单Window → Example打开一个窗口会得到以下结果:

ue3d - UIToolkit使用MultiColumnTreeView实现多列树视图

现在能够确认它已正确的实施了。

以上是3D天堂关于Unity中的UI Toolkit使用MultiColumnTreeView实现多列树视图的全部内容,如果你有任何反馈,请随时在本页面下方留言。

相关信息

  • 类型:知识
  • 字数:323
  • 字符:4208
  • 使用软件:Unity2022.2.17
  • 说明:无
  • 编号:157023

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!