public
partial
class
MainWindow
:
Window
{
List
<
Matrix
> matrixlist =
new
List
<
Matrix
>(); //添加操作Matrix集合
List
<
MatrixAndBool
> matrixlist2 =
new
List
<
MatrixAndBool
>(); //添加反转后的操作
public
MainWindow()
{
InitializeComponent();
//用于移动墨迹
grid.MouseDown +=
new
MouseButtonEventHandler
(grid_PreviewMouseDown);
grid.MouseMove +=
new
MouseEventHandler
(grid_PreviewMouseMove);
grid.MouseUp +=
new
MouseButtonEventHandler
(grid_PreviewMouseUp);
}
void
grid_PreviewMouseUp(
object
sender,
MouseButtonEventArgs
e)
{
hashcode = 0;
grid.ReleaseMouseCapture();
}
void
grid_PreviewMouseMove(
object
sender,
MouseEventArgs
e)
{
if
(sender.GetHashCode() != hashcode)
return
;
Point
NewPoint = e.GetPosition(grid);
Vector
v = NewPoint - oldpoint;
oldpoint = NewPoint;
Matrix
m =
Matrix
.Identity;
m.Translate(v.X, v.Y);
ink.Strokes.Transform(m,
false
);
matrixlist.Add(m);
m.Invert(); //所以提前反转
matrixlist2.Add(
new
MatrixAndBool
(m,
false
));
}
int
hashcode = 0;
Point
oldpoint =
new
Point
();
void
grid_PreviewMouseDown(
object
sender,
MouseButtonEventArgs
e)
{
if
(!canMove)
return
;
hashcode = sender.GetHashCode();
oldpoint = e.GetPosition(grid);
grid.CaptureMouse();
}
bool
canMove =
false
;
private
void
button1_Click(
object
sender,
RoutedEventArgs
e)
{
canMove =
true
;
}
private
void
button2_Click(
object
sender,
RoutedEventArgs
e)
{
//方法一:集合只有Matrix
//方法一:集合只有Matrix
//matrixlist.Reverse();
//matrixlist.ForEach(_ => {
// _.Invert(); //在方法一这里反转有作用
// ink.Strokes.Transform(_,false);
//});
//matrixlist.Clear();
//方法二:使用了类对象可以放更多数据
matrixlist2.Reverse();
matrixlist2.ForEach(_ =>
{
//_.M.Invert();
//此种集合在这里反转已经没有作用
ink.Strokes.Transform(_.M,
true
);
});
matrixlist2.Clear();
}
private
void
button3_Click(
object
sender,
RoutedEventArgs
e)
{
canMove =
false
;
}
private
void
button4_Click(
object
sender,
RoutedEventArgs
e)
{
Matrix
m =
Matrix
.Identity;
m.ScaleAt(1.1,1.1,ink.Width / 2, ink.Height / 2);
m.OffsetX = 0;
m.OffsetY = 0;
ink.Strokes.Transform(m,
true
);
m.Invert();
matrixlist2.Add(
new
MatrixAndBool
(m,
true
));
}
private
void
button5_Click(
object
sender,
RoutedEventArgs
e)
{
Matrix
m =
Matrix
.Identity;
m.ScaleAt(0.9, 0.9, ink.Width / 2, ink.Height / 2);
m.OffsetX = 0;
m.OffsetY = 0;
ink.Strokes.Transform(m,
true
);
//matrixlist.Add(m);
m.Invert();
matrixlist2.Add(
new
MatrixAndBool
(m,
true
));
}
private
void
button6_Click(
object
sender,
RoutedEventArgs
e)
{
ink.Strokes.Clear();
}
}
public
class
MatrixAndBool
{
public
Matrix
M {
get
;
set
; }
public
bool
Value {
get
;
set
; }
public
MatrixAndBool(
Matrix
matrix,
bool
b)
{
M = matrix;
Value = b;
}
}
对于复原墨迹(移动与缩放对触点的修改不同),需要使用 一个Bool变量记录是否需要修改触点的大小,所以使用方法二就可以了,也可以扩展。