UIToolkit编辑器练习(二)

闲话不表,书接上回,在上回书说到,创建了一个List用来显示元素,这次就要做一个显示并且可以做修改的界面

1.设计UI

在这里我在UIBuilder中设计了一个简单的UI,以供显示和修改数据,这里要注意左边的命名方式,并且将ID设置为ReadOnly
UIToolkit编辑器练习(二)

2.实现选择功能

我们简单的修改一下之前的代码:

	VisualElement root;
	//保存itemList选中的物品
    private static XElement selectedItem;
	private void OnEnable()
    {
    	root = rootVisualElement;
    	//...
   		//为之前的ListView添加selectionChange函数,设置选中的物品
   		BindItemData();
   		itemList.onSelectionChange += (obj) => 
        {
            selectedItem = itemList.selectedItem as XElement;
            RefreshItemData();
            //Debug.Log(selectedItem.Element("Name").Value);
        };
   	}

    //-------------绑定数据-----------
    TextField IName;
    IntegerField IID;
    EnumField IType;
    IntegerField IItemAmount;
    //事先绑定所需的数据
    private void BindItemData()
    {
        IName = root.Q<TextField>("IName");
        IID = root.Q<IntegerField>("IID");
        IType = root.Q<EnumField>("IType");
        IType.Init(CItemType.Default);
        IItemAmount = root.Q<IntegerField>("IItemAmount");
    }
    //用于在点击ListView的物品后在UI中显示出来
    private void RefreshItemData()
    {
        if (selectedItem == null) return;
        IName.value = selectedItem.Element("Name").Value;
        IID.value = Convert.ToInt32(selectedItem.Element("ID").Value);
        IType.value = (CItemType)(Convert.ToInt32(selectedItem.Element("ItemType").Value));
        IItemAmount.value = Convert.ToInt32(selectedItem.Element("ItemAmount").Value);
    }
	
	//相较之前将更新函数独立出来
    private void OnFocus()
    {
        Refresh();
    }
    //用于在修改数据后刷新List列表
    private void Refresh()
    {
        ItemManager.Instance.Refresh();
        datas = new List<XElement>(ItemManager.Instance.GetAllElements());
        itemList.itemsSource = datas;
        itemList.Refresh();
    }

现在我们就能够实现如下的点击效果:
UIToolkit编辑器练习(二)

3.实现修改后保存功能

只需要为Save按钮写上保存功能即可,这里顺便将添加元素的功能修改一下,用来添加一个空的物品

	private void OnEnable()
    {
    	//...
		AddElementButton.clicked += () => 
        {
            CItem item = new CItem()
            {
                name = "Default",
                //用来获得最新的ID
                id = ItemManager.Instance.GetLatestID(),
                itemType = CItemType.Default,
                itemAmount = 0
            };
            ItemManager.Instance.AddElement(item);
            ItemManager.Instance.Save();
            Refresh();
        };
		//...
    	//保存修改
        Button saveButton = root.Q<Button>("Save");
        saveButton.clicked += () => 
        {
            SaveItemData();
            Debug.Log(string.Format("物品{0}的数据保存成功!",selectedItem.Element("Name").Value));
        };
    }

	private void SaveItemData()
    {
        if (selectedItem == null) return;
        selectedItem.Element("Name").Value = IName.value;
        selectedItem.Element("ID").Value = IID.value.ToString();
        //这里感觉写麻烦了,如果有简单的方法请分享一下
        selectedItem.Element("ItemType").Value = ((int)Enum.Parse(typeof(CItemType), IType.value.ToString())).ToString();
        selectedItem.Element("ItemAmount").Value = IItemAmount.value.ToString();
        ItemManager.Instance.Save();
        Refresh();
    }
public class ItemManager : Singleton<ItemManager>
{
	//添加一个获取ID的函数
	public int GetLatestID()
    {
        return System.Convert.ToInt32(((XElement)root.LastNode).Element("ID").Value) + 1;
    }
}

最后展示一下这两个功能:
UIToolkit编辑器练习(二)

上一篇:c#-来自选定联系人的Outlook信息


下一篇:java – 无法在ListView上的自定义ArrayAdapter中获取Selected Item Index