using OpenTap; using OpenTap.Addin.Annotation; using OpenTapEditor.Entity; using OpenTapEditor.Provider; using OpenTapEditor.UI; using Panuon.WPF.UI; using System.ComponentModel; using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Media; using System.Xml.Serialization; using UILib.DpUtil; namespace OpenTapEditor { public class UISettingsProvider { private static ITypeData resourceTypeData = TypeData.FromType(typeof(IResource)); /// /// 获取需要渲染的属性 /// /// /// public static Dictionary GetRenderProperty(object obj) { var res = new Dictionary(); var properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var property in properties) { if (property.GetCustomAttribute() != null) { res[property.Name] = property; } } return res; } /// /// 获取需要渲染的方法 /// /// /// public static Dictionary GetRenderMethods(object obj) { var res = new Dictionary(); var methods = obj.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public); foreach (var method in methods) { if (method.GetCustomAttribute() != null) { res[method.Name] = method; } } return res; } public static bool FilterMember(IMemberData member) { if (member.DeclaringType.DescendsTo(resourceTypeData) && member.Name == nameof(Resource.Name)) return true; if (member.GetAttribute() is BrowsableAttribute attr) return attr.Browsable; if (member.HasAttribute()) return true; return member.Attributes.Any(a => a is XmlIgnoreAttribute) == false && member.Writable; } public static Grid GetControl(object obj) { var grid = new Grid() { }; // 继承 App 级别的所有资源 grid.Resources.MergedDictionaries.Add(Application.Current.Resources); var properties = GetRenderProperty(obj); int i = 0; string GroupName = new Guid().ToString(); foreach (var key in properties.Keys) { var property = properties[key]; var display = property.GetCustomAttribute(); var fg = new FormGroup { Orientation = Orientation.Horizontal, GroupName = GroupName }; fg.SetValue(FormGroup.HeaderProperty, new DynamicResourceExtension(display.Name).ProvideValue(null)); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) }); grid.Children.Add(fg); Grid.SetRow(fg, i); var element = FormGroupProvider.RanderElement(obj, display, property); //if (element is VariableTextBox vtb) //{ // BindingOperations.SetBinding(vtb, VariableTextBox.SeqProperty, // new Binding("Seq") // { // Source = parent, // }); //} fg.Content = element; //BindingOperations.SetBinding(fg, FormGroup.IsEnabledProperty, new Binding(nameof(StepSettingView.CanEdit)) //{ // Source = parent, //}); if (property.GetCustomAttribute() is DependOnAttribute doa) { BindingOperations.SetBinding(fg, FrameworkElement.VisibilityProperty, new Binding(doa.BindingName) { Source = obj, Converter = VisibilityConvertor.Instance, ConverterParameter = doa.TargetValue }); } i++; } foreach (var node in GetRenderMethods(obj)) { var method = node.Value; var display = method.GetCustomAttribute(); var btn = new Button { Content = display.Name }; btn.Click += (sender, e) => { method.Invoke(obj, null); }; grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) }); grid.Children.Add(btn); Grid.SetRow(btn, i); Grid.SetColumn(btn, 0); i++; } if (obj is ITestStepParent tsp) { grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) }); var fg = new FormGroup { Orientation = Orientation.Horizontal, Header = "Break Condition", GroupName = GroupName }; grid.Children.Add(fg); Grid.SetRow(fg, i); var s = BreakConditionProperty.GetBreakCondition(tsp); var element = new BreakConditionCtrl { Source = tsp }; fg.Content = element; } GridHelper.SetSpace(grid, 5); GridHelper.RefreshGridSpace(grid); return grid; } } }