using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; namespace Common.system { internal enum ZPenType : byte { Pen = 1, Erase = 2 }; /// /// 画板线模型 /// internal class ZBBPage { /// /// 线 /// public List lines { get; set; } /// /// 历史记录 /// public List lines_histoty { get; set; } /// /// 画板模型 /// public ZBBPage() { lines = new List(); lines_histoty = new List(); } } internal class ZBBPageStep { public StrokeCollection lines_curr { get; set; } public StrokeCollection lines_add { get; set; } public StrokeCollection lines_remove { get; set; } public ZBBPageStep() { lines_curr = new StrokeCollection(); lines_add = new StrokeCollection(); lines_remove = new StrokeCollection(); } } public class BlackboardNew { private InkCanvas m_canvas; //private ZPenType type = ZPenType.Pen; /// /// 当前页索引 /// private int pagenum = 0; /// /// 橡皮大小 /// private readonly int erasesize = 64; /// /// 笔粗细 /// private readonly int pensize = 3; /// /// 是否在进行撤销恢复操作 /// private int undoOrRedo = 0; /// /// 笔颜色 /// private Color pencolor; /// /// 所有画板线 /// private readonly List strokes_page_all = new List(); // 添加这个变量是因为在用橡皮擦时 一次操作会触发多次StrokesChanged回掉 这里是把多次回掉合并在一起 private ZBBPageStep step = null; public BlackboardNew(InkCanvas canvas) { init(canvas, Colors.White); } public BlackboardNew(InkCanvas canvas, Color _pencolor) { init(canvas, _pencolor); } private DrawingAttributes drawingAttributes; private void init(InkCanvas canvas, Color _pencolor) { m_canvas = canvas; pencolor = _pencolor; ZBBPage page = new ZBBPage(); page.lines.Add(new ZBBPageStep()); strokes_page_all.Add(page); if (canvas != null) { canvas.EditingMode = InkCanvasEditingMode.Ink; drawingAttributes = new DrawingAttributes(); canvas.DefaultDrawingAttributes = drawingAttributes; drawingAttributes.Width = pensize; drawingAttributes.Height = pensize; drawingAttributes.Color = pencolor; drawingAttributes.FitToCurve = true; drawingAttributes.IgnorePressure = false; canvas.Strokes.StrokesChanged += Strokes_StrokesChanged; canvas.StrokeCollected += Canvas_StrokeCollected; canvas.StrokeErasing += Canvas_StrokeErasing; canvas.StrokeErased += Canvas_StrokeErased; canvas.MouseUp += Canvas_MouseUp; } } private void Canvas_StrokeErasing(object sender, InkCanvasStrokeErasingEventArgs e) { undoOrRedo = 0; } private void Canvas_StrokeErased(object sender, RoutedEventArgs e) { } private void Canvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) { } private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) { if (step != null) { if (pagenum + 1 > strokes_page_all.Count) { ZBBPage pagetemp = new ZBBPage(); pagetemp.lines.Add(new ZBBPageStep()); strokes_page_all.Add(pagetemp); } try { ZBBPage page = strokes_page_all[pagenum]; if (page != null) { step.lines_curr.Add(m_canvas.Strokes); page.lines.Add(step); step = null; } } catch (Exception ex) { if (strokes_page_all != null) { if (strokes_page_all.Count == 0) { ZBBPage pagetemp = new ZBBPage(); pagetemp.lines.Add(new ZBBPageStep()); strokes_page_all.Add(pagetemp); } } LogHelper.WriteErrLog("【画板】(Canvas_MouseUp)添加失败,strokes_page_all为0," + ex.Message, ex); } } } private void Strokes_StrokesChanged(object sender, StrokeCollectionChangedEventArgs e) { if (undoOrRedo > 0) { undoOrRedo -= 1; return; } if (step == null) { step = new ZBBPageStep(); } // 笔模式 if (e.Added.Count > 0 && e.Removed.Count == 0) { step.lines_add.Add(e.Added); } // 橡皮模式 会多次进入回掉 else if (e.Removed.Count > 0) { step.lines_add.Add(e.Added); for (int i = 0; i < e.Removed.Count; i++) { Stroke removeItem = e.Removed[i]; if (step.lines_add.Contains(removeItem)) { step.lines_add.Remove(removeItem); } else { step.lines_remove.Add(removeItem); } } } } // public方法 笔 public void change_pen(Color _color) { //this.type = ZPenType.Pen; DrawingAttributes drawingAttributes = new DrawingAttributes(); m_canvas.DefaultDrawingAttributes = drawingAttributes; drawingAttributes.Color = _color; drawingAttributes.Width = pensize; drawingAttributes.Height = pensize; drawingAttributes.FitToCurve = true; drawingAttributes.IgnorePressure = false; m_canvas.EditingMode = InkCanvasEditingMode.Ink; } // 橡皮 public void change_erase() { //this.type = ZPenType.Erase; m_canvas.EditingMode = InkCanvasEditingMode.EraseByPoint; m_canvas.EraserShape = new EllipseStylusShape(erasesize, erasesize, 0); } // 撤销 public void undo() { ZBBPage page = strokes_page_all[pagenum]; if (page != null && m_canvas.Strokes.Count > 0 && page.lines.Count > 1) { ZBBPageStep last = page.lines.Last(); page.lines.Remove(last); page.lines_histoty.Add(last); if (page.lines.Last().lines_curr.Count > 0) { undoOrRedo = 2; } else { undoOrRedo = 1; } m_canvas.Strokes.Clear(); m_canvas.Strokes.Add(page.lines.Last().lines_curr); } } // 恢复 public void redo() { ZBBPage page = strokes_page_all[pagenum]; if (page != null && page.lines_histoty.Count > 0) { ZBBPageStep line = page.lines_histoty[page.lines_histoty.Count - 1]; page.lines.Add(line); page.lines_histoty.Remove(line); if (page.lines.Last().lines_curr.Count > 0) { undoOrRedo = 2; } else { undoOrRedo = 1; } m_canvas.Strokes.Clear(); m_canvas.Strokes.Add(page.lines.Last().lines_curr); } } // 清空 public void clear() { //ZBBPage page = new ZBBPage(); //page.lines.Add(new ZBBPageStep()); //page.lines = new List(); //page.lines_histoty = new List(); //strokes_page_all.Add(page); strokes_page_all.Clear(); m_canvas.Strokes.Clear(); //for (int i=0;i< strokes_page_all.Count;i++) //{ // ZBBPage page = strokes_page_all[pagenum]; // if (page != null) // { // m_canvas.Strokes.Clear(); // page.lines_histoty.Clear(); // page.lines.Clear(); // page.lines.Add(new ZBBPageStep()); // } //} } /// /// 翻页 /// /// public void changepage(int mpagenum) { if (pagenum != mpagenum) { pagenum = mpagenum; //新增页 if (pagenum >= strokes_page_all.Count) { int numadd = pagenum - strokes_page_all.Count + 1; for (int i = 0; i < numadd; i++) { ZBBPage pagetemp = new ZBBPage(); pagetemp.lines.Add(new ZBBPageStep()); strokes_page_all.Add(pagetemp); } } ZBBPage page = strokes_page_all[pagenum]; if (page != null && page.lines.Count > 0) { if (page.lines.Last().lines_curr.Count > 0) { undoOrRedo += 1; } if (m_canvas.Strokes.Count > 0) { undoOrRedo += 1; m_canvas.Strokes.Clear(); } //StrokeCollection strokes = new StrokeCollection(); StylusPointCollection stylusPoints = new StylusPointCollection(); //System.Windows.Input.StylusPointDescription stylusPointDescription = new StylusPointDescription(); StylusPoint stylusPoint = new StylusPoint { X = 580, Y = 212 }; stylusPoints.Add(stylusPoint); Stroke stroke = new Stroke(stylusPoints); stylusPoint.X = 581; stylusPoint.Y = 213; stylusPoints.Add(stylusPoint); stroke = new Stroke(stylusPoints); page.lines.Last().lines_curr.Add(stroke); m_canvas.Strokes.Add(page.lines.Last().lines_curr); } } } private StylusPointCollection stylusPoints = new StylusPointCollection(); private StylusPoint stylusPoint = new StylusPoint(); private Stroke stroke; private bool isFirst = true; public void changepages(double _x, double _y, bool _new, Color _color, int _size, int i, float Pressure) { if (_new) { if (stroke != null && stroke.StylusPoints.Count > 1) { isFirst = true; try { if (strokes_page_all.Count <= i) { ZBBPage pagetemp = new ZBBPage(); pagetemp.lines.Add(new ZBBPageStep()); strokes_page_all.Add(pagetemp); } strokes_page_all[i].lines.Last().lines_curr.Add(stroke); } catch (Exception ex) { if (strokes_page_all != null) { if (strokes_page_all.Count == 0) { ZBBPage pagetemp = new ZBBPage(); pagetemp.lines.Add(new ZBBPageStep()); strokes_page_all.Add(pagetemp); } } LogHelper.WriteErrLog("【画板】(changepages)添加失败,strokes_page_all为0," + ex.Message, ex); } } stylusPoints = new StylusPointCollection(); stylusPoint = new StylusPoint(); stroke = null; } else { if (isFirst) { stylusPoint.X = _x; stylusPoint.Y = _y; //_color.A = (byte)(Pressure * 255f); //stylusPoint.PressureFactor = Pressure; stylusPoints.Add(stylusPoint); if (stylusPoints.Count > 1) { stroke = new Stroke(stylusPoints); drawingAttributes = new DrawingAttributes { Color = _color, Width = _size * 4.5, Height = _size * 4.5, FitToCurve = true, //IsHighlighter =true, IgnorePressure = true }; stroke.DrawingAttributes = drawingAttributes; m_canvas.Strokes.Add(stroke); isFirst = false; } } else { if (m_canvas.Strokes.Count > 0) { stylusPoint.X = _x; stylusPoint.Y = _y; stylusPoints.Add(stylusPoint); stroke = new Stroke(stylusPoints); drawingAttributes = new DrawingAttributes { Color = _color, Width = _size * 4.5, Height = _size * 4.5, FitToCurve = true, IgnorePressure = false }; stroke.DrawingAttributes = drawingAttributes; m_canvas.Strokes[m_canvas.Strokes.Count - 1] = stroke; } } } } //public void changepages(double _x, double _y, bool _new, Color _color, int _size, int i) //{ // try // { // if (_new) // { // if (stroke != null && stroke.StylusPoints.Count > 1) // { // drawingAttributes = new DrawingAttributes(); // //m_canvas.DefaultDrawingAttributes = drawingAttributes; // drawingAttributes.Color = _color; // drawingAttributes.Width = _size * 5; // drawingAttributes.Height = _size * 5; // drawingAttributes.FitToCurve = true; // drawingAttributes.IgnorePressure = false; // stroke.DrawingAttributes = drawingAttributes; // //m_canvas.DefaultDrawingAttributes= drawingAttributes; // m_canvas.Strokes.Add(stroke); // strokes_page_all[i].lines.Last().lines_curr.Add(stroke); // //int currCount= strokes_page_all[i].lines.Last().lines_curr.Count; // //if (currCount > 0) // //{ // // strokes_page_all[i].lines.Last().lines_curr[currCount - 1] = stroke; // //} // stroke = null; // } // stylusPoints = new StylusPointCollection(); // stylusPoint = new StylusPoint(); // //stroke = new Stroke(stylusPoints); // //stroke = null; // } // else // { // //stylusPoints = new StylusPointCollection(); // //stylusPoint = new StylusPoint(); // stylusPoint.X = _x; // stylusPoint.Y = _y; // stylusPoints.Add(stylusPoint); // stroke = new Stroke(stylusPoints); // } // } // catch (Exception ex) // { // LogHelper.WriteErrLog("【XHMicroLessonSystemWindow】(changepages)点阵比书写报错:" + ex.Message, ex); // } //} } }