博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF之Manipulation
阅读量:5212 次
发布时间:2019-06-14

本文共 9221 字,大约阅读时间需要 30 分钟。

原文:

需求:现,在窗口下有一个StackPanel控件.

  1.可以拖动.

  2.可以展开及收缩(不仅仅可以拖动还可以点击)

  3.窗口向坐标轴一样分四个象限,在不同的区域停靠在不同的地方(四个角).

 

第一阶段:

  我遇到的问题:

  1.起初完成的时候发现StackPanel拖动的时候一直发疯一样的抖,

   解决方法:ManipulationStarting事件中,e.ManipulationContainer = this.myGrid,容器要父控件,我原先写成自己本身了.

  2.为啥写了之后触控点不动?

   解决发发:查看构造函数中myStackPanel.RenderTransform = new MatrixTransform(),但是这样做会给后面留下新的问题,花了我一天时间找出这处.后面详述.

1 Xaml's code: 2  3 
7
8
14
15
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Windows; 6 using System.Windows.Controls; 7 using System.Windows.Data; 8 using System.Windows.Documents; 9 using System.Windows.Input;10 using System.Windows.Media;11 using System.Windows.Media.Imaging;12 using System.Windows.Shapes;13 14 namespace LearnWpf15 {16     /// 17     /// ManipulationDemo.xaml 的交互逻辑18     /// 19     public partial class ManipulationDemo : Window20     {21         public ManipulationDemo()22         {23             InitializeComponent();24             myStackPanel.RenderTransform = new MatrixTransform();25             myStackPanel.IsManipulationEnabled = true;26         }27 28         private void StackPanel_ManipulationStarting(object sender, ManipulationStartingEventArgs e)29         {30             StackPanel element = (StackPanel)e.OriginalSource;31             e.ManipulationContainer = this.myGrid;32             e.Mode = ManipulationModes.All;33         }34 35         private void StackPanel_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)36         {37             FrameworkElement element = (FrameworkElement)e.Source;38             Matrix matrix = ((MatrixTransform)element.RenderTransform).Matrix;39             ManipulationDelta deltaManipulation = e.DeltaManipulation;40             Point center = new Point(element.ActualWidth / 2, element.ActualHeight / 2);41             center = matrix.Transform(center);42             matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, center.X, center.Y);43             matrix.RotateAt(e.DeltaManipulation.Rotation, center.X, center.Y);44             matrix.Translate(e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y);45             ((MatrixTransform)element.RenderTransform).Matrix = matrix;46         }47 48         private void StackPanel_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)49         {50 51         }52     }53 }

第二阶段:

<这里我想把它推上首页了,因为很多地方肯定没有做好,希望各位提提宝贵意见,还有一些问题想请教大家.还有很多地方注释没有完善

,因为我是现写的,请大家多多包容>

  上一章,我们完成了触控条件下的操作,但是现在有一个问题:鼠标肿么办?

  解决方案:利用MouseLeftButtonDown,MouseMove,MouseLeftButtonUp写.

  还有需求中的要点击怎么办?

  解决方案:这个我是要肿么办呢?决定用Touch事件做了.但是感觉又跟Manipulation重复了.详情请看代码.Touch事件和Manipulation事件重复了,没有注释掉,可以注释掉Manipulation事件,各位亲自理.

  遇到问题:当鼠标和触摸两个事件一起发生时,会发生一起奇怪的现象,我做了处理,但是不能够解决,各位大大有什么看法?  

1 
5
6
10
11
1 CSharp Code   2  using System;  3  using System.Collections.Generic;  4  using System.Linq;  5  using System.Text;  6  using System.Windows;  7  using System.Windows.Controls;  8  using System.Windows.Data;  9  using System.Windows.Documents; 10  using System.Windows.Input; 11  using System.Windows.Media; 12  using System.Windows.Media.Imaging; 13  using System.Windows.Shapes; 14   15  namespace LearnWpf 16  { 17      ///  18      /// ManipulationDemo.xaml 的交互逻辑 19      ///  20      public partial class ManipulationDemo : Window 21      { 22          FrameworkElement frameworkElement; //想要操纵的元素 23          bool isFrameworkElementSelect; //想要用鼠标移动的元素是否被选中 24          bool isMouse = false; //鼠标操作中 25          bool isTouch = false; //触摸操作中 26          public ManipulationDemo() 27          { 28              InitializeComponent(); 29              frameworkElement = this.myStackPanel; 30              myStackPanel.RenderTransform = new MatrixTransform(); 31              myStackPanel.IsManipulationEnabled = true; 32          } 33   34          private void StackPanel_ManipulationStarting(object sender, ManipulationStartingEventArgs e) 35          { 36              frameworkElement = (FrameworkElement)e.OriginalSource; 37              e.ManipulationContainer = this.myGrid; 38              e.Mode = ManipulationModes.All; 39              frameworkElement.Opacity = 0.5; 40          } 41   42          private void StackPanel_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 43          { 44              FrameworkElement element = (FrameworkElement)e.Source; 45              Matrix matrix = ((MatrixTransform)element.RenderTransform).Matrix; 46              ManipulationDelta deltaManipulation = e.DeltaManipulation; 47              Point center = new Point(element.ActualWidth / 2, element.ActualHeight / 2); 48              center = matrix.Transform(center); 49              matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, center.X, center.Y); 50              matrix.RotateAt(e.DeltaManipulation.Rotation, center.X, center.Y); 51              //matrix.Translate(e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y); 52              ((MatrixTransform)element.RenderTransform).Matrix = matrix; 53          } 54   55          private void StackPanel_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) 56          { 57              frameworkElement.Opacity = 1; 58          } 59   60          #region 坐标的相关变量定义 61          double dx; //x轴方向的每次移动的距离 62          double dy; //y轴方向每次移动的距离 63   64          double tdx; //x轴方向的每次移动的总距离 65          double tdy; //y轴方向的每次移动的总距离 66   67          double opx; //旧的x轴的值 68          double opy; //旧的y轴的值 69   70          double npx; //新的x轴的值 71          double npy; //新的y轴的值 72          #endregion 73   74          #region Touch事件 75          private void myStackPanel_TouchDown(object sender, TouchEventArgs e) 76          { 77              if (isMouse) return; 78              isTouch = true; 79   80              tdx = 0; 81              tdy = 0; 82   83              Point p = e.GetTouchPoint(this).Position; 84              opx = p.X; 85              opy = p.Y; 86          } 87          private void myStackPanel_TouchMove(object sender, TouchEventArgs e) 88          { 89              if (isMouse) return; 90   91              Point p = e.GetTouchPoint(this).Position;  92              npx = p.X; 93              npy = p.Y; 94              dx = npx - opx; 95              dy = npy - opy; 96              opx = npx; 97              opy = npy; 98   99              tdx += Math.Abs(dx);100              tdy += Math.Abs(dy);101              Move(dx, dy);102          }103          private void myStackPanel_TouchUp(object sender, TouchEventArgs e)104          {105              if (isMouse) return;106  107              if (tdx < 5 || tdy < 5)108              {109                  Click();110              }111  112              isTouch = false;113          }114          #endregion115  116          /// 117          /// 移动frameElement方法118          /// 119          /// 120          /// 121          private void Move(double dx,double dy) 122          {123              Matrix matrix = ((MatrixTransform)frameworkElement.RenderTransform).Matrix;124              matrix.Translate(dx, dy);125              this.frameworkElement.RenderTransform = new MatrixTransform(matrix);126          }127  128          /// 129          /// Click触发的方法130          /// 131          private void Click()132          {133              MessageBox.Show("U hurt me");134          }135  136          private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)137          {138              if (isTouch) return;139              isMouse = true;140  141              tdx = 0;142              tdy = 0;143  144              frameworkElement.Opacity = 0.5;145              frameworkElement = (FrameworkElement)e.OriginalSource;146              isFrameworkElementSelect = true;147              Point p = e.GetPosition(this);148              opx = p.X;149              opy = p.Y;150             151          }152  153          private void Window_MouseMove(object sender, MouseEventArgs e)154          {155              if (isTouch) return;156              157              if (isFrameworkElementSelect)158              {159                  Point p = e.GetPosition(this);160                  npx = p.X;161                  npy = p.Y;162                  dx = npx - opx;163                  dy = npy - opy;164                  opx = npx;165                  opy = npy;166  167                  tdx += Math.Abs(dx);168                  tdy += Math.Abs(dy);169                  Move(dx, dy);170              }171          }172  173          private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)174          {175              if (isTouch) return;176  177              frameworkElement.Opacity = 1;178              isFrameworkElementSelect = false;179              if (tdx < 5 || tdy < 5)180              {181                  Click();182              }183  184              isMouse = false;185          }186      }187  }

11/15/2012 初次整理

 

posted on
2019-04-18 11:20 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10728516.html

你可能感兴趣的文章
Asp.netMVC中Ajax.BeginForm上传文件
查看>>
手机验证码执行流程
查看>>
python 基础 ----- 变量
查看>>
查看系统事件日志
查看>>
VK Cup 2016 - Qualification Round 2 B. Making Genome in Berland
查看>>
Eclipse 一直提示 loading descriptor for 的解决方法
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
为块级元素添加链接
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
:hover 鼠标同时触发两个元素变化
查看>>
go语言学习十三 - 相等性
查看>>
python生成可执行exe文件
查看>>
Idea 提交代码到码云(提交到github也大同小异)
查看>>
c#连接excel2007未安装ISAM解决
查看>>
Mono 异步加载数据更新主线程
查看>>
初识lua
查看>>
我是插件狂人,jDuang,jValidator,jModal,jGallery
查看>>
张季跃 201771010139《面向对象程序设计(java)》第四周学习总结
查看>>
如何解除循环引用
查看>>
android中fragment的使用及与activity之间的通信
查看>>