private void ComplateEdit() { if (!IsVisible) { return; } //合法性检查 string err = CfgPath.CheckTagFormat(Edit.Text); if (err != null) { MessageBox.Show(err, "标签不合法,请重新输入", MessageBoxButton.OK, MessageBoxImage.Error); return; } //第一步,先将编辑器隐藏起来,否则后面有TextChangedCallback导致业务流程处理后, //会有很多意想不到的流程发生,导致多次递归调用本函数(HideEdit)。 //比如:HideEdit=>lostfocus=>HideEdit GUTag tag = NoEdit.GUTag; string oldTitle = NoEdit.Text; string newTitle = Edit.Text; Canvas parentBak = Parent; //将这两个置空,表示该编辑器不可见了(IsVisible = false)。 Parent = null; NoEdit = null; try { //隐藏编辑框 parentBak.Children.Remove(Edit); System.Diagnostics.Debug.WriteLine("HideFloat1"); //如果文本内容发生修改,通知观察者 if (oldTitle != newTitle && oldTitle != null && newTitle != null) { TextChangedCallback?.Invoke(parentBak, tag, newTitle); System.Diagnostics.Debug.WriteLine("HideFloat2"); } } finally { parentBak?.Focus(); //因为编辑框失去焦点时会有相应的处理,所以这儿设置焦点的处理必须放在所有处理完成之后 //否则可能形成递归调用 } }
//编辑框失去焦点,表示输入结束,关闭编辑框并通知变更 private void Edit_LostFocus(object sender, RoutedEventArgs e) { string err = CfgPath.CheckTagFormat(Edit.Text); if (err != null) { CancelEdit(); MessageBox.Show(err, "标签不合法,请重新输入", MessageBoxButton.OK, MessageBoxImage.Error); return; } else { ComplateEdit(); } }