想请问下..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 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);
}
事件 内的运算 是用来 说明 物体惯性的 比如 物体移动 的减速度是多少 物体在5秒内 停止移动 还是在10秒内停止移动 里面有个减速度参数什么的
这些运算是写在这个时间里的而你 需要的功能 物体 移动到 边框 要么 停止 要么 执行 反弹操作 这些运算 应该写在
Window_ManipulationDelta 事件里
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; }
用模拟器在64位系统上不能用。