Ejemplo n.º 1
0
        /// <summary>
        /// 创建一个数组元素自定义的ArrayElement
        /// </summary>
        /// <param name="customerAttribute"></param>
        /// <param name="depth"></param>
        /// <returns></returns>
        public InspectorElement CreateCustomerArrayElemnet(CustomerElementAttribute customerAttribute, int depth)
        {
            InspectorElement element = Activator.CreateInstance(typeof(ArrayElement), customerAttribute) as InspectorElement;

            element.Inspector = this;
            element.Depth     = depth;
            return(element);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 通过UI类型获取UIItem
        /// </summary>
        /// <param name="elementType"></param>
        /// <param name="drawerParent"></param>
        /// <returns></returns>
        public InspectorElement CreateDrawerForType(Type elementType, int depth, params object[] args)
        {
            InspectorElement element = Activator.CreateInstance(elementType, args) as InspectorElement;

            element.Inspector = this;
            element.Depth     = depth;
            return(element);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 绑定UI
        /// </summary>
        /// <param name="parent">UI</param>
        /// <param name="member">成员</param>
        /// <param name="variableName">变量名称</param>
        public void BindTo(InspectorElement parent, MemberInfo member, string proertyName)
        {
            string variableName = proertyName;

            if (member is FieldInfo field)
            {
                if (variableName == null)
                {
                    variableName = field.Name;
                }

                if (!field.FieldType.IsValueType)
                {
                    BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) =>
                    {
                        field.SetValue(parent.Value, value);
                    });
                }
                else
                {
                    BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) =>
                    {
                        field.SetValue(parent.Value, value);
                        parent.Value = parent.Value;         // 这一步是为了将struct的值不断向上一级传递
                    });
                }
            }
            else if (member is PropertyInfo property)
            {
                if (variableName == null)
                {
                    variableName = property.Name;
                }

                if (!property.PropertyType.IsValueType)
                {
                    BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) =>
                    {
                        property.SetValue(parent.Value, value, null);
                    });
                }
                else
                {
                    BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) =>
                    {
                        property.SetValue(parent.Value, value, null);
                        parent.Value = parent.Value;
                    });
                }
            }
            else
            {
                throw new ArgumentException("Member can either be a field or a property");
            }
        }
Ejemplo n.º 4
0
        protected override void CreateElements()
        {
            if (Value == null)
            {
                return;
            }

            if (IsArray)
            {
                Array array = (Array)Value;
                for (int i = 0; i < array.Length; i++)
                {
                    InspectorElement elementDrawer = CreateDrawerForMemberType();
                    if (elementDrawer == null)
                    {
                        break;
                    }

                    int index = i;
                    elementDrawer.BindTo(elementType, "Element " + i, () => ((Array)Value).GetValue(index), (value) =>
                    {
                        Array _array = (Array)Value;
                        _array.SetValue(value, index);
                        Value = _array;
                    });
                    elementDrawer.Refresh();

                    elementsContent.Add(elementDrawer);
                }
            }
            else
            {
                IList list = (IList)Value;
                for (int i = 0; i < list.Count; i++)
                {
                    InspectorElement elementDrawer = CreateDrawerForMemberType();
                    if (elementDrawer == null)
                    {
                        break;
                    }

                    int j = i;
                    elementDrawer.BindTo(elementType, "Element " + i, () => ((IList)Value)[j], (value) =>
                    {
                        IList _list = (IList)Value;
                        _list[j]    = value;
                        Value       = _list;
                    });
                    elementDrawer.Refresh();

                    elementsContent.Add(elementDrawer);
                }
            }
        }