private FrameworkElement OnGeneratingControl(Controllable control, ControlItem item)
        {
            FrameworkElement result = null;

            GeneratingControl?.Invoke(this, control, item, ref result);
            if (result != null)
            {
                return(result);
            }
            if (item.Type == ControlItem.PropType.Enum)
            {
                var cbox = new ComboBox
                {
                    ItemsSource = item.Cookie as string[]
                };
                cbox.SetBinding(ComboBox.SelectedItemProperty, CreateControlItemBinding(control, item));
                return(cbox);
            }
            if (item.ValType == typeof(string))
            {
                if (item.Type == ControlItem.PropType.LongText)
                {
                    var btn = new Button {
                        Content = "查看"
                    };
                    btn.Click += (o, e) =>
                    {
                        control.DoGetMember(item.Id, out object txt);
                        new TextDialog(txt as string, $"{control.ToString()} --- {item.Name}").Show();
                        e.Handled = true;
                    };
                    return(btn);
                }
                {
                    var tbox = new TextBox
                    {
                        VerticalAlignment = VerticalAlignment.Center
                    };
                    tbox.SetBinding(TextBox.TextProperty, CreateControlItemBinding(control, item));
                    tbox.IsReadOnly = !item.Access.HasFlag(ControlItem.PropAccess.Write);
                    return(tbox);
                }
            }
            if (item.ValType == typeof(Vector2))
            {
                var limit  = (Vector2)item.Cookie;
                var slider = new RangeSlider
                {
                    AutoToolTipPlacement = AutoToolTipPlacement.TopLeft,
                    AutoToolTipPrecision = 3,
                    Minimum = limit.X,
                    Maximum = limit.Y
                };
                slider.SetBinding(RangeSlider.LowerValueProperty,
                                  CreateControlItemBinding(control, item, new TwoWayValueConvertor(
                                                               o => ((Vector2)o).X,
                                                               o => new Vector2(Convert.ToSingle(o), (float)slider.HigherValue))
                                                           ));
                slider.SetBinding(RangeSlider.HigherValueProperty,
                                  CreateControlItemBinding(control, item, new TwoWayValueConvertor(
                                                               o => ((Vector2)o).Y,
                                                               o => new Vector2((float)slider.LowerValue, Convert.ToSingle(o)))
                                                           ));
                return(slider);
            }
            if (item.ValType == typeof(Color))
            {
                var clrPicker = new ColorPicker()
                {
                    ColorMode = ColorMode.ColorCanvas
                };
                clrPicker.SetBinding(ColorPicker.SelectedColorProperty, CreateControlItemBinding(control, item));
                return(clrPicker);
            }
            if (item.ValType == typeof(float))
            {
                if (item.Cookie == null)
                {
                    var spiner = new DoubleUpDown {
                        FormatString = "F2", Increment = 0.1
                    };
                    spiner.SetBinding(DoubleUpDown.ValueProperty, CreateControlItemBinding(control, item, ConvertorForceSingle));
                    return(spiner);
                }
                else
                {
                    var limit  = (Vector2)item.Cookie;
                    var slider = new Slider
                    {
                        AutoToolTipPlacement = AutoToolTipPlacement.TopLeft,
                        AutoToolTipPrecision = 3,
                        Minimum = limit.X,
                        Maximum = limit.Y
                    };
                    slider.SetBinding(Slider.ValueProperty, CreateControlItemBinding(control, item, ConvertorForceSingle));
                    return(slider);
                }
            }
            if (item.ValType == typeof(ushort))
            {
                if (item.Cookie == null)
                {
                    var spiner = new IntegerUpDown {
                        Increment = 1
                    };
                    spiner.SetBinding(IntegerUpDown.ValueProperty, CreateControlItemBinding(control, item, ConvertorForceUShort));
                    return(spiner);
                }
                else
                {
                    dynamic limit  = item.Cookie;
                    var     slider = new Slider
                    {
                        AutoToolTipPlacement = AutoToolTipPlacement.TopLeft,
                        Minimum = limit.Item1,
                        Maximum = limit.Item2
                    };
                    slider.SetBinding(Slider.ValueProperty, CreateControlItemBinding(control, item, ConvertorForceUShort));
                    return(slider);
                }
            }
            if (item.ValType == typeof(int))
            {
                if (item.Cookie == null)
                {
                    var spiner = new IntegerUpDown {
                        Increment = 1
                    };
                    spiner.SetBinding(IntegerUpDown.ValueProperty, CreateControlItemBinding(control, item));
                    return(spiner);
                }
                else
                {
                    dynamic limit  = item.Cookie;
                    var     slider = new Slider
                    {
                        AutoToolTipPlacement = AutoToolTipPlacement.TopLeft,
                        Minimum = limit.Item1,
                        Maximum = limit.Item2
                    };
                    slider.SetBinding(Slider.ValueProperty, CreateControlItemBinding(control, item, ConvertorForceInt));
                    return(slider);
                }
            }
            if (item.ValType == typeof(bool))
            {
                var ckBox = new CheckBox
                {
                    VerticalAlignment   = VerticalAlignment.Center,
                    HorizontalAlignment = HorizontalAlignment.Center
                };
                ckBox.SetBinding(CheckBox.IsCheckedProperty, CreateControlItemBinding(control, item));
                return(ckBox);
            }
            {
                var tblock = new TextBlock
                {
                    VerticalAlignment   = VerticalAlignment.Center,
                    HorizontalAlignment = HorizontalAlignment.Center
                };
                tblock.SetBinding(TextBlock.TextProperty, CreateControlItemBinding(control, item));
                return(tblock);
            }
        }