Penntrådsmodellen

En av fördelarna med bläck på en Tablet PC är att det känns mycket som att skriva med en vanlig penna och papper. För att åstadkomma detta samlar tablet-pennan in indata med en mycket högre hastighet än en mus gör och återger pennanteckningen när användaren skriver. Programmets användargränssnittstråd (UI) räcker inte för att samla in penndata och återge pennanteckningar, eftersom det kan blockeras. För att lösa detta använder ett WPF-program ytterligare två trådar när en användare skriver pennanteckning.

I följande lista beskrivs de trådar som deltar i insamling och återgivning av digital pennanteckning:

  • Penntråd – tråden som tar indata från pennan. (I verkligheten är detta en trådpool, men det här avsnittet refererar till den som en penntråd.)

  • Tråd för programanvändargränssnitt – den tråd som styr programmets användargränssnitt.

  • Dynamisk återgivningstråd – tråden som återger pennanteckningen medan användaren ritar en linje. Den dynamiska återgivningstråden skiljer sig från tråden som renderar andra gränssnittselement för programmet, som nämns i Window Presentation Foundation Threading Model.

Pennanteckningsmodellen är densamma oavsett om programmet använder InkCanvas eller en anpassad kontroll som liknar den i Skapa en pennanteckningskontroll. Även om det här avsnittet beskriver trådning i termer av InkCanvas, gäller samma begrepp när du skapar en anpassad kontroll.

Översikt över trådning

Följande diagram illustrerar trådmodellen när en användare ritar en linje:

Trådningsmodell vid ritning av en linje.

  1. Åtgärder som inträffar när användaren ritar strecket

    1. När användaren drar ett slag kommer pennans punkter in på penntråden. Stylus-plugin-program, inklusive DynamicRenderer, accepterar pennpunkterna på penntråden och har möjlighet att ändra dem innan de InkCanvas tar emot dem.

    2. Återger DynamicRenderer pennans punkter i den dynamiska återgivningstråden. Detta sker samtidigt som föregående steg.

    3. Tar InkCanvas emot pennans punkter i användargränssnittstråden.

  2. Åtgärder som inträffar när användaren avslutar stroken

    1. När användaren är klar med att rita strecket skapar InkCanvas ett Stroke objekt och lägger till det i InkPresenter, som renderar det statiskt.

    2. Användargränssnittstråden DynamicRenderer meddelar att strecket återges statiskt, så DynamicRenderer tar bort sin visuella representation av strecket.

Ink-samling och Stylus-plugin-program

Var och UIElement en har en StylusPlugInCollection. Objekten i StylusPlugIn kan ta emot och ändra stylusspetsarna på penntråden StylusPlugInCollection. Objekten StylusPlugIn tar emot pennans punkter enligt deras ordning i StylusPlugInCollection.

Följande diagram illustrerar den hypotetiska situationen där StylusPlugIns samlingen av en UIElement innehåller stylusPlugin1, en DynamicRenderer, och stylusPlugin2, i den ordningen.

Ordningen på Stylus-plugin-program påverkar utdata.

I föregående diagram sker följande beteende:

  1. StylusPlugin1 ändrar värdena för x och y.

  2. DynamicRenderer tar emot de ändrade pennapunkterna och renderar dem på den dynamiska återgivningstråden.

  3. StylusPlugin2 tar emot de ändrade pennapunkterna och ändrar värdena för x och y ytterligare.

  4. Programmet samlar in pennans punkter och återger statiskt strecket när användaren har slutfört stroken.

Anta att det stylusPlugin1 begränsar pennans punkter till en rektangel och stylusPlugin2 översätter pennans punkter till höger. I föregående scenario mottager DynamicRenderer de begränsade stylus-punkterna, men inte de översatta stylus-punkterna. När användaren ritar strecket återges strecket inom rektangelns gränser, men strecket verkar inte översättas förrän användaren lyfter pennan.

Utföra åtgärder med ett Stylus-plugin-program i användargränssnittstråden

Eftersom korrekt träfftestning inte kan utföras på penntråden kan vissa element ibland ta emot pennans indata som är avsedda för andra element. Om du behöver kontrollera att indata dirigerades korrekt innan du utför en åtgärd, bör du prenumerera på och utföra åtgärden i OnStylusDownProcessed, OnStylusMoveProcessed eller OnStylusUpProcessed-metoden. Dessa metoder anropas av programtråden när korrekt träfftestning har utförts. Om du vill prenumerera på dessa metoder anropar NotifyWhenProcessed du metoden i den metod som förekommer i penntråden.

Följande diagram illustrerar relationen mellan penntråden och användargränssnittstråden med avseende på pennans händelser i en StylusPlugIn.

Penntrådsmodeller (användargränssnitt och penna)

Återgivning av bläck

När användaren ritar en linje DynamicRenderer renderar pennanteckningen på en separat tråd så att pennanteckningen verkar "flöda" från pennan även när användargränssnittstråden är upptagen. DynamicRenderer bygger ett visuellt träd på den dynamiska återgivningstråden medan den samlar in styluspunkter. När användaren har slutfört strecket begär DynamicRenderer att bli meddelad när programmet gör nästa återgivningspass. När programmet har slutfört nästa återgivningspass, rensar DynamicRenderer applikationens visuella träd. Följande diagram illustrerar den här processen.

Diagram över bläcktrådning

  1. Användaren påbörjar stroken.

    1. DynamicRenderer skapar det visuella trädet.
  2. Användaren ritar linjen.

    1. Skapar DynamicRenderer det visuella trädet.
  3. Användaren avslutar draget.

    1. InkPresenter lägger till strecket i sitt visuella träd.

    2. Mil (Media Integration Layer) återger statiskt linjerna.

    3. Rensar DynamicRenderer de visuella objekten.