ManipulationDeltaEventArgs.ReportBoundaryFeedback(ManipulationDelta) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Gibt an, dass die Manipulation über bestimmte Grenzen hinausgegangen ist.
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)
Parameter
- unusedManipulation
- ManipulationDelta
Der Teil der Bearbeitung, die das Verschieben über die Begrenzung hinaus darstellt.
Ausnahmen
unusedManipulation
ist null
.
Beispiele
Das folgende Beispiel zeigt einen Ereignishandler für das Ereignis, das ManipulationDelta die ReportBoundaryFeedback -Methode aufruft, wenn der Benutzer das Element über den Rand seines Containers verschiebt. Führen Sie zum Testen dieses Beispiels die Schritte unter Exemplarische Vorgehensweise: Erstellen Ihrer First Touch-Anwendung aus, und ersetzen Sie den Code in Schritt 5 durch diesen Code.
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
Hinweise
Verwenden Sie die ReportBoundaryFeedback -Methode, um anzugeben, dass ein Element eine bestimmte Grenze überschritten hat. Wenn ein Benutzer beispielsweise ein Element außerhalb der Grenzen eines Windowverschiebt, können Sie diese Methode aufrufen, um dies an das Fenster zu melden. Wenn Sie aufrufen ReportBoundaryFeedback, tritt das ManipulationBoundaryFeedback -Ereignis auf. Standardmäßig abonniert ManipulationBoundaryFeedback das Window Ereignis, um dem Benutzer visuelles Feedback zu geben, dass eine Grenze erreicht wurde. Sie können abonnieren, ManipulationBoundaryFeedback um benutzerdefiniertes Verhalten zu implementieren.