WPF Incanvas中墨迹的移动缩放 与复位

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 
      //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变量记录是否需要修改触点的大小,所以使用方法二就可以了,也可以扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值