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 _mCanvas;
//private ZPenType type = ZPenType.Pen;
///
/// 当前页索引
///
private int _pagenum;
///
/// 橡皮大小
///
private readonly int _erasesize = 64;
///
/// 笔粗细
///
private readonly int _pensize = 3;
///
/// 是否在进行撤销恢复操作
///
private int _undoOrRedo;
///
/// 笔颜色
///
private Color _pencolor;
///
/// 所有画板线
///
private readonly List _strokesPageAll = new List();
// 添加这个变量是因为在用橡皮擦时 一次操作会触发多次StrokesChanged回掉 这里是把多次回掉合并在一起
private ZbbPageStep _step;
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 mpencolor)
{
_mCanvas = canvas;
this._pencolor = mpencolor;
ZbbPage page = new ZbbPage();
page.lines.Add(new ZbbPageStep());
_strokesPageAll.Add(page);
if (canvas != null)
{
canvas.EditingMode = InkCanvasEditingMode.Ink;
_drawingAttributes = new DrawingAttributes();
canvas.DefaultDrawingAttributes = _drawingAttributes;
_drawingAttributes.Width = _pensize;
_drawingAttributes.Height = _pensize;
_drawingAttributes.Color = this._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 > _strokesPageAll.Count)
{
ZbbPage pagetemp = new ZbbPage();
pagetemp.lines.Add(new ZbbPageStep());
_strokesPageAll.Add(pagetemp);
}
try
{
ZbbPage page = _strokesPageAll[_pagenum];
if (page != null)
{
_step.lines_curr.Add(_mCanvas.Strokes);
page.lines.Add(_step);
_step = null;
}
}
catch (Exception ex)
{
if (_strokesPageAll != null)
{
if (_strokesPageAll.Count == 0)
{
ZbbPage pagetemp = new ZbbPage();
pagetemp.lines.Add(new ZbbPageStep());
_strokesPageAll.Add(pagetemp);
}
}
LogHelper.Logerror.Error("【画板】(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();
_mCanvas.DefaultDrawingAttributes = drawingAttributes;
drawingAttributes.Color = color;
drawingAttributes.Width = _pensize;
drawingAttributes.Height = _pensize;
drawingAttributes.FitToCurve = true;
drawingAttributes.IgnorePressure = false;
_mCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
// 橡皮
public void change_erase()
{
//this.type = ZPenType.Erase;
_mCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
_mCanvas.EraserShape = new EllipseStylusShape(_erasesize, _erasesize, 0);
}
// 撤销
public void Undo()
{
ZbbPage page = _strokesPageAll[_pagenum];
if (page != null && _mCanvas.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;
}
_mCanvas.Strokes.Clear();
_mCanvas.Strokes.Add(page.lines.Last().lines_curr);
}
}
// 恢复
public void Redo()
{
ZbbPage page = _strokesPageAll[_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;
}
_mCanvas.Strokes.Clear();
_mCanvas.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);
_strokesPageAll.Clear();
_mCanvas.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 >= _strokesPageAll.Count)
{
int numadd = _pagenum - _strokesPageAll.Count + 1;
for (int i = 0; i < numadd; i++)
{
ZbbPage pagetemp = new ZbbPage();
pagetemp.lines.Add(new ZbbPageStep());
_strokesPageAll.Add(pagetemp);
}
}
ZbbPage page = _strokesPageAll[_pagenum];
if (page != null && page.lines.Count > 0)
{
if (page.lines.Last().lines_curr.Count > 0)
{
_undoOrRedo += 1;
}
if (_mCanvas.Strokes.Count > 0)
{
_undoOrRedo += 1;
_mCanvas.Strokes.Clear();
}
//StrokeCollection strokes = new StrokeCollection();
StylusPointCollection mstylusPoints = new StylusPointCollection();
//System.Windows.Input.StylusPointDescription stylusPointDescription = new StylusPointDescription();
StylusPoint mstylusPoint = new StylusPoint { X = 580, Y = 212 };
mstylusPoints.Add(mstylusPoint);
Stroke stroke;
mstylusPoint.X = 581;
mstylusPoint.Y = 213;
mstylusPoints.Add(mstylusPoint);
stroke = new Stroke(mstylusPoints);
page.lines.Last().lines_curr.Add(stroke);
_mCanvas.Strokes.Add(page.lines.Last().lines_curr);
}
}
}
private StylusPointCollection _stylusPoints = new StylusPointCollection();
private StylusPoint _stylusPoint;
private Stroke _stroke;
private bool _isFirst = true;
public void Changepages
(
double x,
double y,
bool mnew,
Color color,
int size,
int i,
float pressure
)
{
if (mnew)
{
if (_stroke != null && _stroke.StylusPoints.Count > 1)
{
_isFirst = true;
try
{
if (_strokesPageAll.Count <= i)
{
ZbbPage pagetemp = new ZbbPage();
pagetemp.lines.Add(new ZbbPageStep());
_strokesPageAll.Add(pagetemp);
}
_strokesPageAll[i].lines.Last().lines_curr.Add(_stroke);
}
catch (Exception ex)
{
if (_strokesPageAll != null)
{
if (_strokesPageAll.Count == 0)
{
ZbbPage pagetemp = new ZbbPage();
pagetemp.lines.Add(new ZbbPageStep());
_strokesPageAll.Add(pagetemp);
}
}
LogHelper.Logerror.Error("【画板】(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;
_mCanvas.Strokes.Add(_stroke);
_isFirst = false;
}
}
else
{
if (_mCanvas.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;
_mCanvas.Strokes[_mCanvas.Strokes.Count - 1] = _stroke;
}
}
}
}
//public void changepages(double _x, double _y, bool mnew, Color _color, int _size, int i)
//{
// try
// {
// if (mnew)
// {
// 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.Logerror.Error("【XHMicroLessonSystemWindow】(changepages)点阵比书写报错:" + ex.Message, ex);
// }
//}
}
}