언어

ManipulationDeltaEventArgs.ReportBoundaryFeedback(ManipulationDelta) 메서드

정의

조작이 특정 경계를 넘어섰음을 지정합니다.

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입니다.

예제

다음 예제에서는 사용자가 컨테이너의 ManipulationDelta 가장자리 위로 요소를 이동할 때 메서드를 호출 ReportBoundaryFeedback 하는 이벤트에 대한 이벤트 처리기를 보여 있습니다. 이 예제를 테스트하려면 연습: 첫 번째 터치 애플리케이션 만들기 의 단계를 수행하고 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호출하여 창에 보고할 수 있습니다. 호출 ReportBoundaryFeedbackManipulationBoundaryFeedback 하면 이벤트가 발생합니다. 기본적으로 이벤트를 Window 구독하여 경계에 ManipulationBoundaryFeedback 도달한 사용자에게 시각적 피드백을 제공합니다. 사용자 지정 동작을 구현하도록 구독할 ManipulationBoundaryFeedback 수 있습니다.

적용 대상