private void GetArgsAndInitComboBoxes() { BindingDef def = null; foreach (ComboBox cb in _comboxes.Keys) { def = _comboxes[cb]; cb.Items.Clear(); Dictionary <IAction, PropertyInfo[]> atts = _bindingEnvironment.QueryCompatibleProperty(_action, def.BindingAttribute, def.PropertyInfo); if (atts != null && atts.Count > 0) { foreach (IAction act in atts.Keys) { PropertyInfo[] ps = atts[act]; if (ps == null || ps.Length == 0) { continue; } foreach (PropertyInfo p in ps) { BindingAttribute ba = ArgBindingHelper.GetBingdingAttribute(p.Name, act); BindingScriptObject script = new BindingScriptObject(act, ba, p, def.PropertyInfo); cb.Items.Add(script); } } } } }
public BindingScriptObject(IAction refAction, BindingAttribute refBindingAtt, PropertyInfo refPropertyInfo, PropertyInfo targetPropertyInfo) { RefAction = refAction; RefPropertyInfo = refPropertyInfo; RefBindingAtt = refBindingAtt; TargetPropertyInfo = targetPropertyInfo; }
private int CreateLabel(int top, PropertyInfo p, BindingAttribute att) { Label lb = new Label(); lb.Top = top; lb.Left = cstLeft - 14; lb.Text = "○" + att.Name + ":"; lb.Width = Width - lb.Left - 64; lb.Height = 18; panelTop.Controls.Add(lb); return(top + lb.Height); }
private int CreateComboBox(int top, PropertyInfo p, BindingAttribute att, out ComboBox cb, BindingPair[] pairs) { cb = new ComboBox(); if (pairs != null && pairs.Length > 0) { InitExistBindingPair(cb, p, pairs); } //填充现有值 object pValue = _action.GetType().InvokeMember(p.Name, BindingFlags.GetProperty, null, _action, null); if (pValue != null) { cb.Text = (new BindingDef(p, att, cb).Editor).ToString(pValue); cb.Tag = pValue; } // cb.Left = cstLeft; cb.Top = top; cb.Width = Width - cb.Left - cstRight; _comboxes.Add(cb, new BindingDef(p, att, cb)); cb.KeyPress += new KeyPressEventHandler(cb_KeyPress); cb.DropDown += new EventHandler(cb_DropDown); cb.SelectedIndexChanged += new EventHandler(cb_SelectedIndexChanged); panelTop.Controls.Add(cb); if (IsRefType(att.SemanticType)) { cb.Width -= 24; Button btnEditor = new Button(); btnEditor.Tag = new BindingDef(p, att, cb); if (IsArgFile(att.SemanticType)) { btnEditor.Image = imageList1.Images[2]; } else if (IsArgDirectory(att.SemanticType)) { btnEditor.Image = imageList1.Images[3]; } else { btnEditor.Image = imageList1.Images[4]; } btnEditor.Left = cb.Right + 2; btnEditor.Top = cb.Top; btnEditor.Width = 24; btnEditor.Height = 20; btnEditor.Click += new EventHandler(btnEditor_Click); panelTop.Controls.Add(btnEditor); } return(top + cb.Height + 4); }
/// <summary> /// 绑定引用到Action /// </summary> /// <param name="arg">参数绑定定义对象</param> /// <param name="act">待绑定Action</param> /// <param name="actType">待绑定Action的具体类型</param> /// <returns>是否绑定成功</returns> private bool BindRefValueToAction(ActionArg arg, IAction act, Type actType) { try { //从已执行队列中发现参数来源Action IAction resAction = FindAction(arg.RefActionId); if (resAction == null) { if ((act as ActionBase).Id != arg.RefActionId) { LogError(string.Format(errRefActionLost2, act.Name, arg.Name)); return(false); } else { resAction = act; } } //获取源Action的BingdingAttribute 元数据 Filename QualityChecker BindingAttribute resBindingAtt = ArgBindingHelper.GetBingdingAttribute(arg.RefName, resAction); if (resBindingAtt == null) { LogError(string.Format(errBindingAttributeLost4, act.Name, arg.Name, resAction.Name, arg.RefName)); return(false); } //获取目标Action的BingdingAttribute Filename SpecialRegionChecker BindingAttribute desBindingAtt = ArgBindingHelper.GetBingdingAttribute(arg.Name, act); if (desBindingAtt == null) { LogError(string.Format(errBindingAttributeLost4, act.Name, arg.Name, act.Name, arg.Name)); return(false); } //绑定参数语义类型是否兼容,泛型关系暂未做处理 if (!resBindingAtt.SemanticType.Equals(desBindingAtt.SemanticType)) { LogError(string.Format(errArgTypeNotMatch4, act.Name, arg.Name, resAction.Name, arg.RefName)); } //从源Action获取绑定值 Action1:QualityChecker.Filename object refValue = resAction.GetType().InvokeMember(arg.RefName, BindingFlags.GetProperty, null, resAction, null); //将获取到的绑定值绑定到目标Action的参数arg.Name Action2:SpecialRegionChecker.Filename actType.InvokeMember(arg.Name, BindingFlags.SetProperty, null, act, new object[] { refValue }); return(true); } catch (Exception ex) { LogError(string.Format(errBindArgFaileExceptionAtNextLog2, act.Name, arg.Name)); LogException(ex); return(false); } }
private int CreateInputControl(int top, PropertyInfo p, BindingAttribute att, BindingPair[] pairs) { ComboBox cb = null; top = CreateComboBox(top, p, att, out cb, pairs); Type type = p.PropertyType; if (type.BaseType != null && type.BaseType.Equals(typeof(Array))) { top = CreateListBox(top, cb, p, att); } else { _dindingDefs.Add(new BindingDef(p, att, cb)); } return(top); }
public Dictionary <IAction, PropertyInfo[]> QueryCompatibleProperty(IAction action, BindingAttribute bindingAttribute, PropertyInfo propertyInfo) { if (_actionElements == null || _actionElements.Count == 0) { return(null); } Dictionary <IAction, PropertyInfo[]> atts = new Dictionary <IAction, PropertyInfo[]>(); // foreach (ActionElement ele in _actionElements) { IAction act = ele.Action; if (act.Equals(action)) { continue; } Dictionary <PropertyInfo, BindingAttribute> ps = ArgBindingHelper.GetBindingProperties(act.GetType()); List <PropertyInfo> infos = new List <PropertyInfo>(); foreach (PropertyInfo info in ps.Keys) { infos.Clear(); BindingAttribute ba = ps[info]; if (!bindingAttribute.SemanticType.Equals(ba.SemanticType)) { continue; } if (!propertyInfo.PropertyType.Equals(info.PropertyType)) { continue; } if (ba.Direction == enumBindingDirection.Input || ba.Direction == enumBindingDirection.None) { continue; } infos.Add(info); } if (infos.Count > 0) { atts.Add(act, infos.ToArray()); } } return(atts); }
private int CreateListBox(int top, ComboBox cb, PropertyInfo p, BindingAttribute att) { ListBox lstBox = new ListBox(); // _dindingDefs.Add(new BindingDef(p, att, lstBox)); // lstBox.Left = cstLeft; lstBox.Top = top + 4; lstBox.Height = 100; lstBox.Width = Width - lstBox.Left - 66; panelTop.Controls.Add(lstBox); // Button addBtn = new Button(); //addBtn.Text = "增加"; addBtn.Image = imageList1.Images[0]; addBtn.Left = lstBox.Right + 2; addBtn.Top = top + 4; addBtn.Width = 24; addBtn.Height = 22; addBtn.Tag = new BtnTag(cb, lstBox); addBtn.Click += new EventHandler(addBtn_Click); panelTop.Controls.Add(addBtn); // Button delBtn = new Button(); //delBtn.Text = "移除"; delBtn.Image = imageList1.Images[1]; delBtn.Left = lstBox.Right + 2; delBtn.Top = top + 26 + 4; delBtn.Width = 24; delBtn.Height = 22; delBtn.Tag = new BtnTag(cb, lstBox); delBtn.Click += new EventHandler(delBtn_Click); panelTop.Controls.Add(delBtn); // return(top + lstBox.Height + 8); }
private void BuildControls() { Type type = _action.GetType(); Dictionary <PropertyInfo, BindingAttribute> properites = ArgBindingHelper.GetBindingProperties(type); if (properites == null || properites.Count == 0) { return; } int top = 20; BindingPair[] pairs = null; if (_bindingEnvironment != null) { pairs = _bindingEnvironment.GetBindingPairs(_action); } foreach (PropertyInfo p in properites.Keys) { BindingAttribute att = properites[p]; if (att.Direction == enumBindingDirection.None || att.Direction == enumBindingDirection.Output) { continue; } top = CreateLabel(top, p, att); top = CreateInputControl(top, p, att, pairs); } foreach (Control c in panelTop.Controls) { if (c is ComboBox || c is ListBox) { c.Anchor = c.Anchor | AnchorStyles.Right; } else if (c is Button) { c.Anchor = AnchorStyles.Top | AnchorStyles.Right; } } }
public BindingDef(PropertyInfo propertyInfo, BindingAttribute bindingAtt, Control inputControl) { PropertyInfo = propertyInfo; BindingAttribute = bindingAtt; InputControl = inputControl; }