ManipulationDeltaEventArgs.ReportBoundaryFeedback(ManipulationDelta) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
指明该操作已经超出了一定界限。
public:
void ReportBoundaryFeedback(System::Windows::Input::ManipulationDelta ^ unusedManipulation);
public void ReportBoundaryFeedback (System.Windows.Input.ManipulationDelta unusedManipulation);
member this.ReportBoundaryFeedback : System.Windows.Input.ManipulationDelta -> unit
Public Sub ReportBoundaryFeedback (unusedManipulation As ManipulationDelta)
参数
- unusedManipulation
- ManipulationDelta
表示移动出边界的操作部分。
例外
unusedManipulation
为 null
。
示例
以下示例演示当用户将 元素移到其容器边缘时调用 ReportBoundaryFeedback 方法的 事件的事件处理程序ManipulationDelta。 若要测试此示例,请按照 演练:创建第一个触摸应用程序中 的步骤进行操作,并将步骤 5 中的代码替换为此代码。
void Window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
Rectangle rectToMove = e.OriginalSource as Rectangle;
Vector overshoot;
// When the element crosses the boundary of the window, check whether
// the manipulation is in inertia. If it is, complete the manipulation.
// Otherwise, report the boundary feedback.
if (CalculateOvershoot(rectToMove, e.ManipulationContainer, out overshoot))
{
if (e.IsInertial)
{
e.Complete();
e.Handled = true;
return;
}
else
{
//Report that the element hit the boundary
e.ReportBoundaryFeedback(new ManipulationDelta(overshoot, 0, new Vector(), new Vector()));
}
}
// Move the element as usual.
// Get the Rectangle and its RenderTransform matrix.
Matrix rectsMatrix = ((MatrixTransform)rectToMove.RenderTransform).Matrix;
// Rotate the Rectangle.
rectsMatrix.RotateAt(e.DeltaManipulation.Rotation,
e.ManipulationOrigin.X,
e.ManipulationOrigin.Y);
// Resize the Rectangle. Keep it square
// so use only the X value of Scale.
rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X,
e.DeltaManipulation.Scale.X,
e.ManipulationOrigin.X,
e.ManipulationOrigin.Y);
// Move the Rectangle.
rectsMatrix.Translate(e.DeltaManipulation.Translation.X,
e.DeltaManipulation.Translation.Y);
// Apply the changes to the Rectangle.
rectToMove.RenderTransform = new MatrixTransform(rectsMatrix);
e.Handled = true;
}
private bool CalculateOvershoot(UIElement element, IInputElement container, out Vector overshoot)
{
// Get axis aligned element bounds
var elementBounds = element.RenderTransform.TransformBounds(
VisualTreeHelper.GetDrawing(element).Bounds);
//double extraX = 0.0, extraY = 0.0;
overshoot = new Vector();
FrameworkElement parent = container as FrameworkElement;
if (parent == null)
{
return false;
}
// Calculate overshoot.
if (elementBounds.Left < 0)
overshoot.X = elementBounds.Left;
else if (elementBounds.Right > parent.ActualWidth)
overshoot.X = elementBounds.Right - parent.ActualWidth;
if (elementBounds.Top < 0)
overshoot.Y = elementBounds.Top;
else if (elementBounds.Bottom > parent.ActualHeight)
overshoot.Y = elementBounds.Bottom - parent.ActualHeight;
// Return false if Overshoot is empty; otherwsie, return true.
return !Vector.Equals(overshoot, new Vector());
}
Private Sub Window_ManipulationDelta(ByVal sender As Object, ByVal e As ManipulationDeltaEventArgs)
Dim rectToMove As Rectangle = TryCast(e.OriginalSource, Rectangle)
Dim overshoot As Vector
' When the element crosses the boundary of the window, check whether
' the manipulation is in inertia. If it is, complete the manipulation.
' Otherwise, report the boundary feedback.
If CalculateOvershoot(rectToMove, e.ManipulationContainer, overshoot) Then
If e.IsInertial Then
e.Complete()
e.Handled = True
Exit Sub
Else
'Report that the element hit the boundary
e.ReportBoundaryFeedback(New ManipulationDelta(overshoot, 0, New Vector(), New Vector()))
End If
End If
' Move the element as usual.
' Get the Rectangle and its RenderTransform matrix.
Dim rectsMatrix As Matrix = DirectCast(rectToMove.RenderTransform, MatrixTransform).Matrix
' Rotate the Rectangle.
rectsMatrix.RotateAt(e.DeltaManipulation.Rotation, e.ManipulationOrigin.X, e.ManipulationOrigin.Y)
' Resize the Rectangle. Keep it square
' so use only the X value of Scale.
rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.X, e.ManipulationOrigin.X, e.ManipulationOrigin.Y)
' Move the Rectangle.
rectsMatrix.Translate(e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y)
' Apply the changes to the Rectangle.
rectToMove.RenderTransform = New MatrixTransform(rectsMatrix)
e.Handled = True
End Sub
Private Function CalculateOvershoot(ByVal element As UIElement, ByVal container As IInputElement, ByRef overshoot As Vector) As Boolean
' Get axis aligned element bounds
Dim elementBounds = element.RenderTransform.TransformBounds(VisualTreeHelper.GetDrawing(element).Bounds)
'double extraX = 0.0, extraY = 0.0;
overshoot = New Vector()
Dim parent As FrameworkElement = TryCast(container, FrameworkElement)
If parent Is Nothing Then
Return False
End If
' Calculate overshoot.
If elementBounds.Left < 0 Then
overshoot.X = elementBounds.Left
ElseIf elementBounds.Right > parent.ActualWidth Then
overshoot.X = elementBounds.Right - parent.ActualWidth
End If
If elementBounds.Top < 0 Then
overshoot.Y = elementBounds.Top
ElseIf elementBounds.Bottom > parent.ActualHeight Then
overshoot.Y = elementBounds.Bottom - parent.ActualHeight
End If
' Return false if Overshoot is empty; otherwsie, return true.
Return Not Vector.Equals(overshoot, New Vector())
End Function
注解
ReportBoundaryFeedback使用 方法指示元素已超出特定边界。 例如,如果用户将元素移到 的边界 Window之外,则可以调用此方法以向窗口报告该元素。 调用 ReportBoundaryFeedback时,将 ManipulationBoundaryFeedback 发生 事件。 默认情况下, Window 订阅 事件以 ManipulationBoundaryFeedback 向用户提供已达到边界的视觉反馈。 可以订阅 ManipulationBoundaryFeedback 以实现自定义行为。
适用于
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈