/// <summary> /// 在本次编辑栈内,取消<paramref name="trimEditDrawObjectCell"/>的更改内容; /// </summary> /// <param name="trimEditDrawObjectCell"></param> private void UnApplyTrimCell(TrimEditDrawObjectCell trimEditDrawObjectCell) { if (trimEditDrawObjectCell == null) { throw new ArgumentNullException(nameof(trimEditDrawObjectCell)); } foreach (var replacedOriginDrawObject in trimEditDrawObjectCell.ReplacedOriginDrawObjects) { replacedOriginDrawObject.IsVisible = true; } _createdDrawObjects.AddRange(trimEditDrawObjectCell.ReplacedCreatedDrawObjects); _createdDrawObjects.RemoveItems(trimEditDrawObjectCell.NewCreatedDrawObjects); _originReplacedDrawObjects.RemoveItems(trimEditDrawObjectCell.ReplacedOriginDrawObjects); RaiseVisualChanged(); }
/// <summary> /// 在拖放操作按下时,尝试进行裁剪操作; /// </summary> /// <param name="canvasContext"></param> /// <param name="e"></param> private void OnDragSelect(object sender, DragSelectEventArgs e) { if (e == null) { throw new ArgumentNullException(nameof(e)); } //若Control键被按下,中止处理,指示外部可以进行拖放选中; if ((CanvasContext.InputDevice.KeyBoard.ModifierKeys & ModifierKeys.Control) == ModifierKeys.Control) { return; } ///<see cref="ICanvasContextEx"/> 中被选中的绘制对象和 ///<see cref="_createdDrawObjects"/>中被选中的绘制对象为裁剪标准; var originTrimingDrawObjects = CanvasContext.GetAllVisibleDrawObjects().Where(p => p.IsSelected); var createdTrimingDrawObjects = _createdDrawObjects.Where(p => p.IsSelected); var trimingDrawObjects = originTrimingDrawObjects.Union(createdTrimingDrawObjects).ToArray(); ///下为原件以及<see cref="_createdDrawObjects"/>中将被裁剪的绘制对象; ///作为裁剪标准的绘制对象不能被裁剪; var drawObjectsToBeTrimedFromOrigin = e.HitedDrawObjects. Where(p => p.IsVisible). Where(p => !trimingDrawObjects.Contains(p)); var drawObjectsToBeTrimedFromCreated = _createdDrawObjects. Where(p => p.ObjectInRectangle(e.Rectangle2D, CanvasContext.CanvasProxy, true)). Where(p => !trimingDrawObjects.Contains(p)); var newCreatedDrawObjects = new List <DrawObject>(); var replacedOriginDrawObjects = new List <DrawObject>(); var replacedCreatedDrawObjects = new List <DrawObject>(); ///对原件中被框选的绘制对象进行裁剪处理; foreach (var drawObjectToBeTrimedFromOrigin in drawObjectsToBeTrimedFromOrigin) { var trimedDrawObjects = GetTrimedOrExtendedDrawObjects(drawObjectToBeTrimedFromOrigin, trimingDrawObjects, e.Rectangle2D); //若trimedDrawObjects为空,则裁剪未能完成; if (trimedDrawObjects == null) { continue; } newCreatedDrawObjects.AddRange(trimedDrawObjects); replacedOriginDrawObjects.Add(drawObjectToBeTrimedFromOrigin); } ///对<see cref="_createdDrawObjects"/>中框选的绘制对象进行裁剪处理; foreach (var drawObjectToBeTrimedFromCreated in drawObjectsToBeTrimedFromCreated) { var trimedDrawObjects = GetTrimedOrExtendedDrawObjects(drawObjectToBeTrimedFromCreated, trimingDrawObjects, e.Rectangle2D); //若trimedDrawObjects为空,则裁剪未能完成; if (trimedDrawObjects == null) { continue; } newCreatedDrawObjects.AddRange(trimedDrawObjects); replacedCreatedDrawObjects.Add(drawObjectToBeTrimedFromCreated); } if (newCreatedDrawObjects.Count != 0) { var trimCell = new TrimEditDrawObjectCell { NewCreatedDrawObjects = newCreatedDrawObjects.ToArray(), ReplacedCreatedDrawObjects = replacedCreatedDrawObjects.ToArray(), ReplacedOriginDrawObjects = replacedOriginDrawObjects.ToArray() }; ApplyTrimCell(trimCell); _undoTrimEditDrawObjectCells.Push(trimCell); RaiseCanUndoRedoChanged(); } //指示已处理; e.Cancel = true; }