Share via


ManipulationDeltaEventArgs.ReportBoundaryFeedback(ManipulationDelta) Yöntem

Tanım

Düzenlemenin belirli sınırların ötesine geçtiğini belirtir.

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)

Parametreler

unusedManipulation
ManipulationDelta

Düzenlemenin sınırın ötesine geçmeyi temsil eden kısmı.

Özel durumlar

unusedManipulation, null değeridir.

Örnekler

Aşağıdaki örnekte, kullanıcı öğeyi kapsayıcısının kenarından ManipulationDeltaReportBoundaryFeedback taşırken yöntemini çağıran olay için bir olay işleyicisi gösterilmektedir. Bu örneği test etmek için İzlenecek Yol: İlk Dokunmatik Uygulamanızı Oluşturma bölümündeki adımları izleyin ve 5. adımdaki kodu bu kodla değiştirin.

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

Açıklamalar

ReportBoundaryFeedback Bir öğenin belirli bir sınırın ötesine geçtiğini belirtmek için yöntemini kullanın. Örneğin, bir kullanıcı bir öğeyi sınırlarının Windowdışına taşırsa, bunu pencereye bildirmek için bu yöntemi çağırabilirsiniz. çağrısı ReportBoundaryFeedbackManipulationBoundaryFeedback yaptığınızda olay gerçekleşir. Varsayılan olarak, Window kullanıcıya bir sınıra ManipulationBoundaryFeedback ulaşıldığına ilişkin görsel geri bildirim sağlamak için olaya abonedir. Özel davranış uygulamak için öğesine ManipulationBoundaryFeedback abone olabilirsiniz.

Şunlara uygulanır