RawStylusInput.NotifyWhenProcessed(Object) 方法

定义

订阅应用程序线程的相应触笔方法。

public:
 void NotifyWhenProcessed(System::Object ^ callbackData);
public void NotifyWhenProcessed (object callbackData);
member this.NotifyWhenProcessed : obj -> unit
Public Sub NotifyWhenProcessed (callbackData As Object)

参数

callbackData
Object

要传递到应用程序线程的数据。

示例

以下示例创建一个 StylusPlugIn 用于检查手势的 Down 命令。 StylusPlugIn订阅OnStylusUpProcessed方法的调用NotifyWhenProcessedOnStylusUp,该方法是从应用程序线程调用的。

class RecognizerPlugin : StylusPlugIn
{
    GestureRecognizer recognizer;
    
    // StylusPointCollection that contains the stylus points of the current
    // stroke.
    StylusPointCollection points;

    // Keeps track of the stylus to check whether two styluses are used on the
    // digitizer.
    int currentStylus;

    public RecognizerPlugin()
        : base()
    {
        recognizer = new GestureRecognizer();
    }

    // Collect the points as the user draws the stroke.
    protected override void OnStylusDown(RawStylusInput rawStylusInput)
    {
        // If points is not null, there is already a stroke taking place
        // on the digitizer, so don't create a new StylusPointsCollection.
        if (points == null)
        {
            points = new StylusPointCollection(rawStylusInput.GetStylusPoints().Description);
            points.Add(rawStylusInput.GetStylusPoints());
            currentStylus = rawStylusInput.StylusDeviceId;
        }
    }

    // Collect the points as the user draws the stroke.
    protected override void OnStylusMove(RawStylusInput rawStylusInput)
    {
        // Check whether the stylus that started the stroke is the same, and
        // that the element hasn't lost focus since the stroke began.
            if (points != null && currentStylus == rawStylusInput.StylusDeviceId)
        {
            points.Add(rawStylusInput.GetStylusPoints());
        }
    }

    // Collect the points as the user draws the stroke.
    protected override void OnStylusUp(RawStylusInput rawStylusInput)
    {
        // Check whether the stylus that started the stroke is the same, and
        // that the element hasn't lost focus since the stroke began.
        if (points != null && currentStylus == rawStylusInput.StylusDeviceId)
        {
            points.Add(rawStylusInput.GetStylusPoints());

            // Subscribe to the OnStylusUpProcessed method.
            rawStylusInput.NotifyWhenProcessed(points);
        }

        points = null;
        currentStylus = 0;
    }
        
    // If the element loses focus, stop collecting the points and don't
    // perform gesture recognition.
    protected override void OnStylusLeave(RawStylusInput rawStylusInput, bool confirmed)
    {
        if (confirmed)
        {
            // Clear the StylusPointCollection
            points = null;
            currentStylus = 0;
        }
    }

    // This method is called on the application thread.
    protected override void OnStylusUpProcessed(object callbackData, bool targetVerified)
    {
        // Check that the element actually receive the OnStylusUp input.
        if (targetVerified && recognizer.IsRecognizerAvailable)
        {
            StylusPointCollection strokePoints = callbackData as StylusPointCollection;

            if (strokePoints == null)
            {
                return;
            }

            // Create a StrokeCollection to pass to the GestureRecognizer.
            Stroke newStroke = new Stroke(strokePoints);
            StrokeCollection strokes = new StrokeCollection();
            strokes.Add(newStroke);

            ReadOnlyCollection<GestureRecognitionResult> results = recognizer.Recognize(strokes);

            // If the GestureRecognizer recognizes the stroke as a Down
            // gesture with strong confidence, raise an event.
            if (results[0].ApplicationGesture == ApplicationGesture.Down &&
                results[0].RecognitionConfidence == RecognitionConfidence.Strong)
            {
                //raise event
            }
        }
    }
}
Class RecognizerPlugin
    Inherits StylusPlugIn
    Private recognizer As GestureRecognizer

    ' StylusPointCollection that contains the stylus points of the current
    ' stroke.
    Private points As StylusPointCollection

    ' Keeps track of the stylus to check whether two styluses are used on the
    ' digitizer.
    Private currentStylus As Integer

    Public Sub New()
        recognizer = New GestureRecognizer()

    End Sub


    ' Collect the points as the user draws the stroke.
    Protected Overrides Sub OnStylusDown(ByVal rawStylusInput As RawStylusInput)

        ' If points is not null, there is already a stroke taking place
        ' on the digitizer, so don't create a new StylusPointsCollection.
        If points Is Nothing Then
            points = New StylusPointCollection(rawStylusInput.GetStylusPoints().Description)
            points.Add(rawStylusInput.GetStylusPoints())
            currentStylus = rawStylusInput.StylusDeviceId
        End If

    End Sub

    ' Collect the points as the user draws the stroke.
    Protected Overrides Sub OnStylusMove(ByVal rawStylusInput As RawStylusInput)

        ' Check whether the stylus that started the stroke is the same, and
        ' that the element hasn't lost focus since the stroke began.
        If Not (points Is Nothing) AndAlso currentStylus = rawStylusInput.StylusDeviceId Then
            points.Add(rawStylusInput.GetStylusPoints())
        End If

    End Sub

    ' Collect the points as the user draws the stroke.
    Protected Overrides Sub OnStylusUp(ByVal rawStylusInput As RawStylusInput)

        ' Check whether the stylus that started the stroke is the same, and
        ' that the element hasn't lost focus since the stroke began.
        If Not (points Is Nothing) AndAlso currentStylus = rawStylusInput.StylusDeviceId Then
            points.Add(rawStylusInput.GetStylusPoints())

            ' Subscribe to the OnStylusUpProcessed method.
            rawStylusInput.NotifyWhenProcessed(points)
        End If

        points = Nothing
        currentStylus = 0

    End Sub

    ' If the element loses focus, stop collecting the points and don't
    ' perform gesture recognition.
    Protected Overrides Sub OnStylusLeave(ByVal rawStylusInput As RawStylusInput, ByVal confirmed As Boolean)

        If confirmed Then
            ' Clear the StylusPointCollection
            points = Nothing
            currentStylus = 0
        End If

    End Sub

    ' This method is called on the application thread.
    Protected Overrides Sub OnStylusUpProcessed(ByVal callbackData As Object, ByVal targetVerified As Boolean)

        ' Check that the element actually receive the OnStylusUp input.
        If targetVerified AndAlso recognizer.IsRecognizerAvailable Then

            Dim strokePoints As StylusPointCollection = callbackData

            If strokePoints Is Nothing Then
                Return
            End If

            ' Create a StrokeCollection to pass to the GestureRecognizer.
            Dim newStroke As New Stroke(strokePoints)
            Dim strokes As New StrokeCollection()
            strokes.Add(newStroke)

            Dim results As ReadOnlyCollection(Of GestureRecognitionResult) = recognizer.Recognize(strokes)

            ' If the GestureRecognizer recognizes the stroke as a Down
            ' gesture with strong confidence, raise an event.
            If results(0).ApplicationGesture = ApplicationGesture.Down AndAlso _
               results(0).RecognitionConfidence = RecognitionConfidence.Strong Then
                'raise event
            End If
        End If

    End Sub
End Class

注解

笔的输入将路由到笔线程上的元素 StylusPlugIn 。 由于无法对笔线程执行准确的命中测试,因此某些元素有时可能会接收用于其他元素的触笔输入。 如果需要确保在执行操作之前正确路由输入,请在笔线程上的方法中调用 NotifyWhenProcessed 该方法。 下表列出了要调用 NotifyWhenProcessed 以订阅应用程序线程的方法的位置。

在此方法中调用NotifyWhenProcessed 订阅此方法
OnStylusDown OnStylusDownProcessed
OnStylusMove OnStylusMoveProcessed
OnStylusUp OnStylusUpProcessed

适用于