首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

wpf 多点触控的有关问题

2013-04-21 
wpf 多点触控的问题想请问下..wpf中的多点触控 当控件在惯性时如何能让控件不超过window边框(即得到和窗口

wpf 多点触控的问题
想请问下..wpf中的多点触控 当控件在惯性时如何能让控件不超过window边框(即得到和窗口的相对偏移) .在下方的代码即为开始惯性 但是我不知道该如何得到控件时时相对窗体的偏移,只能在惯性之后才能得到.
 private void image_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
        {  
            e.TranslationBehavior = new InertiaTranslationBehavior();
            e.TranslationBehavior.InitialVelocity = e.InitialVelocities.LinearVelocity;
            //e.TranslationBehavior.DesiredDeceleration = 10.0 * 96.0 / (1000.0 * 1000.0);
            e.TranslationBehavior.DesiredDeceleration = App.InteriaParam * 96.0 / (1000.0 * 1000.0);//数值越小惯性越大
            e.ExpansionBehavior = new InertiaExpansionBehavior();
            e.ExpansionBehavior.InitialVelocity = e.InitialVelocities.ExpansionVelocity;
            e.ExpansionBehavior.DesiredDeceleration = 0.1 * 96 / 1000.0 * 1000.0;

            e.RotationBehavior = new InertiaRotationBehavior();
            e.RotationBehavior.InitialVelocity = e.InitialVelocities.AngularVelocity;
            e.RotationBehavior.DesiredDeceleration = 720 / (1000.0 * 1000.0); 
        }

[解决办法]


     private void Window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
        {
            Rectangle rectToMove = e.OriginalSource as Rectangle;
            Matrix rectsMatrix = ((MatrixTransform)rectToMove.RenderTransform).Matrix;
          
            //旋转
            rectsMatrix.RotateAt(e.DeltaManipulation.Rotation, e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
         
            //缩放
            rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.X,
                 e.ManipulationOrigin.X, e.ManipulationOrigin.Y
                );

            //移动


            if (_IfBorder) //如果物体到达边框,我执行的是反弹操作,直接移动变量取反了,动作很生硬,要是想反弹动作平滑,自己在这写算法
            {
                rectsMatrix.Translate(-e.DeltaManipulation.Translation.X,


                          -e.DeltaManipulation.Translation.Y);
            }
            else
            {//没到边框继续 原坐标偏移量运动
                rectsMatrix.Translate(e.DeltaManipulation.Translation.X,
                          e.DeltaManipulation.Translation.Y);
            }
     

            rectToMove.RenderTransform = new MatrixTransform(rectsMatrix);

            Rect containingRect =
                    new Rect(((FrameworkElement)e.ManipulationContainer).RenderSize);

            Rect shapeBounds =
                rectToMove.RenderTransform.TransformBounds(
                    new Rect(rectToMove.RenderSize));


             


            if (e.IsInertial && !containingRect.Contains(shapeBounds))//物体已到达容器边框的判断
            {

                _IfBorder = !_IfBorder;

            }


            e.Handled = true;

        }

热点排行