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
です。
例
次の例は、ユーザーが要素をコンテナーの 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外に要素を移動した場合、このメソッドを呼び出してウィンドウに報告できます。 を呼び出 ReportBoundaryFeedbackすと、イベントが ManipulationBoundaryFeedback 発生します。 既定では、 は Window イベントを ManipulationBoundaryFeedback サブスクライブして、境界に達したことをユーザーに視覚的にフィードバックします。 をサブスクライブして ManipulationBoundaryFeedback カスタム動作を実装できます。
適用対象
.NET