zoukankan      html  css  js  c++  java
  • WPF之Manipulation

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

      1.可以拖动.

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

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

    第一阶段:

      我遇到的问题:

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

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

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

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

     1 Xaml's code:
     2 
     3 <Window x:Class="LearnWpf.ManipulationDemo"
     4         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     5         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     6         Title="ManipulationDemo" Height="300" Width="300">
     7     <Grid x:Name="myGrid">
     8         <StackPanel x:Name="myStackPanel"
     9                     Background="Red" Height="50" Width="50"
    10                     ManipulationStarting="StackPanel_ManipulationStarting"
    11                     ManipulationDelta="StackPanel_ManipulationDelta"
    12                     ManipulationCompleted="StackPanel_ManipulationCompleted"
    13                     />
    14     </Grid>
    15 </Window>
     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 LearnWpf
    15 {
    16     /// <summary>
    17     /// ManipulationDemo.xaml 的交互逻辑
    18     /// </summary>
    19     public partial class ManipulationDemo : Window
    20     {
    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 <Window x:Class="LearnWpf.ManipulationDemo"
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         Title="ManipulationDemo" WindowState="Maximized" Height="300" Width="300" MouseLeftButtonDown="Window_MouseLeftButtonDown" MouseMove="Window_MouseMove" MouseLeftButtonUp="Window_MouseLeftButtonUp">
     5     <Grid x:Name="myGrid">
     6         <StackPanel x:Name="myStackPanel"
     7                     Background="Red" Height="200" Width="200"
     8                     ManipulationStarting="StackPanel_ManipulationStarting" ManipulationDelta="StackPanel_ManipulationDelta" ManipulationCompleted="StackPanel_ManipulationCompleted"
     9                     TouchDown="myStackPanel_TouchDown" TouchMove="myStackPanel_TouchMove" TouchUp="myStackPanel_TouchUp"/>
    10     </Grid>
    11 </Window>
      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      /// <summary>
     18      /// ManipulationDemo.xaml 的交互逻辑
     19      /// </summary>
     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          #endregion
    115  
    116          /// <summary>
    117          /// 移动frameElement方法
    118          /// </summary>
    119          /// <param name="dx"></param>
    120          /// <param name="dy"></param>
    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          /// <summary>
    129          /// Click触发的方法
    130          /// </summary>
    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 初次整理

  • 相关阅读:
    git 远程仓库 and 分支管理
    oracle 导入导出dmp
    sql if else 用法
    设置session超时的三种方式
    eclipse定制工具栏,修改工具栏
    cxf实例异常
    js 表格插入指定行
    iframe 调用父页面元素
    iframe页面刷新
    frame 和 iframe
  • 原文地址:https://www.cnblogs.com/XzcBlog/p/2671668.html
Copyright © 2011-2022 走看看