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); } }