using OpenTap; using OpenTap.Addin.Annotation; using OpenTapEditor.UI; using System.ComponentModel; using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Xml.Serialization; using UILib.DpUtil; namespace OpenTapEditor.Provider { public class GridControlProvider_2 { 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, StepSettingView parent) { var grid = new Grid() { }; grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) }); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }); var properties = GetRenderProperty(obj); int i = 0; foreach (var key in properties.Keys) { var property = properties[key]; var display = property.GetCustomAttribute(); var label = new Label { Content = display.Name }; grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) }); grid.Children.Add(label); Grid.SetRow(label, i); Grid.SetColumn(label, 0); var element = FormGroupProvider.RanderElement(obj, display, property); if (property.GetCustomAttribute() is DependOnAttribute doa) { BindingOperations.SetBinding(element, FrameworkElement.VisibilityProperty, new Binding(doa.BindingName) { Source = obj, Converter = VisibilityConvertor.Instance, ConverterParameter = doa.TargetValue }); } if (element != null) { grid.Children.Add(element); Grid.SetRow(element, i); Grid.SetColumn(element, 1); } 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); Grid.SetColumnSpan(btn, 2); i++; } if (obj is ITestStepParent tsp) { grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) }); var label = new Label { Content = "Break Condition" }; grid.Children.Add(label); Grid.SetRow(label, i); Grid.SetColumn(label, 0); var s = BreakConditionProperty.GetBreakCondition(tsp); var element = new BreakConditionCtrl { Source = tsp }; if (element != null) { grid.Children.Add(element); Grid.SetRow(element, i); Grid.SetColumn(element, 1); } } GridHelper.SetSpace(grid, 5); GridHelper.RefreshGridSpace(grid); return grid; } } }