using OpenTap;
|
using OpenTap.Addin.Annotation;
|
using Panuon.WPF.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 TabControlProvider
|
{
|
private static ITypeData resourceTypeData = TypeData.FromType(typeof(IResource));
|
|
/// <summary>
|
/// 获取需要渲染的属性
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
public static Dictionary<string, PropertyInfo> GetRenderProperty(object obj)
|
{
|
var res = new Dictionary<string, PropertyInfo>();
|
var properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
|
foreach (var property in properties)
|
{
|
if (property.GetCustomAttribute<DisplayAttribute>() != null)
|
{
|
res[property.Name] = property;
|
}
|
}
|
return res;
|
}
|
|
/// <summary>
|
/// 获取需要渲染的方法
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
public static Dictionary<string, MethodInfo> GetRenderMethods(object obj)
|
{
|
var res = new Dictionary<string, MethodInfo>();
|
var methods = obj.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);
|
foreach (var method in methods)
|
{
|
if (method.GetCustomAttribute<DisplayAttribute>() != 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<BrowsableAttribute>() is BrowsableAttribute attr)
|
return attr.Browsable;
|
if (member.HasAttribute<OutputAttribute>())
|
return true;
|
return member.Attributes.Any(a => a is XmlIgnoreAttribute) == false && member.Writable;
|
}
|
|
public static TabControl GetControl(object obj, StepSettingView parent)
|
{
|
var tabControl = new TabControl()
|
{
|
BorderThickness = new Thickness(0,1,0,0)
|
};
|
|
// 继承 App 级别的所有资源
|
tabControl.Resources.MergedDictionaries.Add(Application.Current.Resources);
|
Dictionary<string, TabItem> groupCache = new Dictionary<string, TabItem>();
|
|
StackPanel GetStack(DisplayAttribute display)
|
{
|
string header = display.Header ?? "属性";
|
StackPanel stack = null;
|
if (!groupCache.ContainsKey(header))
|
{
|
stack = new StackPanel()
|
{
|
Margin = new Thickness(5)
|
};
|
var item = new TabItem
|
{
|
Content = stack
|
};
|
item.SetValue(TabItem.HeaderProperty, new DynamicResourceExtension(header).ProvideValue(null));
|
|
item.SetBinding(TabItem.FontSizeProperty, new Binding("FontSize")
|
{
|
Source = parent
|
});
|
tabControl.Items.Add(item);
|
groupCache.Add(header, item);
|
StackPanelHelper.SetChildSpace(stack, 5);
|
}
|
else
|
{
|
stack = (StackPanel)groupCache[header].Content;
|
}
|
return stack;
|
}
|
|
|
var properties = GetRenderProperty(obj);
|
|
int i = 0;
|
foreach (var key in properties.Keys)
|
{
|
var property = properties[key];
|
var display = property.GetCustomAttribute<DisplayAttribute>();
|
string header = display.Header ?? "属性";
|
|
var stack = GetStack(display);
|
|
var fg = new FormGroup
|
{
|
Orientation = Orientation.Horizontal,
|
GroupName = $"{header}",
|
VerticalHeaderAlignment = VerticalAlignment.Top
|
};
|
|
fg.SetValue(FormGroup.HeaderProperty, new DynamicResourceExtension(display.Name).ProvideValue(null));
|
stack.Children.Add(fg);
|
|
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<DependOnAttribute>() 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<DisplayAttribute>();
|
|
var stack = GetStack(display);
|
var btn = new Button
|
{
|
Content = display.Name
|
};
|
|
btn.Click += (sender, e) =>
|
{
|
method.Invoke(obj, null);
|
};
|
|
stack.Children.Add(btn);
|
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;
|
//}
|
return tabControl;
|
}
|
}
|
}
|