Toll-interakciók és Windows Ink a Windows alkalmazásokban

A Surface Pen kiemelt képe.
Surface Pen (megvásárolható a Microsoft Store).

Áttekintés

Optimalizálja a Windows alkalmazást a tollal történő beviteli lehetőséghez, hogy a standard mutatóeszköz funkciókat és a legjobb Windows Ink-élményt biztosítsa a felhasználók számára.

Megjegyzés:

Ez a témakör a Windows Ink platformra összpontosít. Az egérrel, érintéssel és érintőpárnával kapcsolatos általános beviteli kezelésért lásd: A mutató bemenetének kezelése.

A Windows Ink platform és egy digitális toll természetes módot kínál a digitális kézírással készült jegyzetek, rajzok készítésére és széljegyzetek létrehozására. A platform támogatja a digitalizáló bemenetek szabadkézi adatokként való rögzítését, szabadkézi adatok generálását, a szabadkézi adatok kezelését, a szabadkézi adatok szabadkézi vonásként való megjelenítését a kimeneti eszközön, valamint a szabadkézi elemek szöveggé alakítását kézírás-felismeréssel.

Amellett, hogy rögzíti a toll alaphelyzetét és mozgását a felhasználó írása vagy rajzolása során, az alkalmazás nyomon követheti és összegyűjtheti a tollvonások során használt különböző nyomásmennyiségeket. Ez az információ, valamint a tollhegy alakzatának, méretének és elforgatásának, tintaszínének és céljának (egyszerű tinta, törlés, kiemelés és kijelölés) beállításaival együtt lehetővé teszi, hogy olyan felhasználói élményt nyújtson, amely szorosan hasonlít az olyan írásra vagy rajzolásra papírra tollal, ceruzával vagy ecsettel.

Megjegyzés:

Az alkalmazás más mutatóalapú eszközökről is támogathatja a szabadkézet, beleértve az érintéses digitalizálókat és az egéreszközöket is. 

A tintaplatform nagyon rugalmas. Úgy tervezték, hogy az Ön követelményeitől függően különböző szintű funkciókat támogasson.

A Windows Ink UX irányelvekről a Tintázás vezérlők című témakörben talál útmutatást.

A Windows Ink platform összetevői

Összetevő Leírás
InkCanvas Az XAML felhasználói felület platformja azt szabályozza, hogy alapértelmezés szerint egy tollból érkező összes bemenetet szabadkézi vonásként vagy radírozásként fogadja és jeleníti meg.
Az InkCanvas használatáról további információt a Windows tollvonások felismerése szövegként és Windows tollvonások adatainak tárolása és lekérése lehetőségeknél talál.
InkPresenter A háttérben lévő kód objektuma, amely együtt van példányosítva egy InkCanvas vezérlővel (ami a InkCanvas.InkPresenter tulajdonságon keresztül van kitéve). Ez az objektum biztosítja az InkCanvas által nyújtott összes alapértelmezett kézírási funkciót, valamint egy átfogó API-készletet a további testreszabáshoz és személyre szabáshoz.
Az InkPresenter használatáról további információt a A Windows szabadkézi vonások felismerése szövegként és Windows szabadkézi vonások adatainak tárolása és lekérése részben találhat.
InkToolbar XAML felhasználói felületi platform vezérlőelem, amely testre szabható és bővíthető gombgyűjteményt tartalmaz, amely aktiválja a tinta-alapú funkciókat a társított InkCanvasban.
Az InkToolbar használatával kapcsolatos további információkért lásd: InkToolbar hozzáadása egy Windows alkalmazásba szabadkézi alkalmazáshoz.
IInkD2DRenderer Engedélyezi a szabadkézi vonások renderelését egy univerzális Windows-alkalmazás kijelölt Direct2D-eszközkörnyezetében az alapértelmezett InkCanvas vezérlő helyett. Ez lehetővé teszi a tintázási élmény teljes testreszabását.
További információért lásd a Komplex tinta minta-t.

Alapszintű tintázás az InkCanvas-szal

Alapszintű szabadkézi funkciók hozzáadásához egyszerűen helyezzen el egy InkCanvas UWP platformvezérlőt az alkalmazás megfelelő oldalán.

Alapértelmezés szerint a InkCanvas csak tollból támogatja a szabadkézi bemenetet. A bemenetet vagy szabadkézi vonásként jeleníti meg alapértelmezett szín- és vastagságbeállítással (fekete golyóstoll 2 képpont vastagsággal), vagy vonásradírként kezeli (ha a bemenet radírhegyből vagy radírgombbal módosított tollhegyből jön).

Megjegyzés:

Ha nincs radírhegy vagy gomb, az InkCanvas konfigurálható úgy, hogy a tollhegyről származó bemenetet radírvonásként dolgozza fel.

Ebben a példában egy InkCanvas átfedésbe hoz egy háttérképet.

Megjegyzés:

Az InkCanvas alapértelmezett magasság - és szélességtulajdonsága nulla, kivéve, ha egy olyan elem gyermeke, amely automatikusan méretezi a gyermekelemeket, például a StackPanel vagy a Rács vezérlőket.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel x:Name="HeaderPanel" Orientation="Horizontal" Grid.Row="0">
        <TextBlock x:Name="Header"
                   Text="Basic ink sample"
                   Style="{ThemeResource HeaderTextBlockStyle}"
                   Margin="10,0,0,0" />            
    </StackPanel>
    <Grid Grid.Row="1">
        <Image Source="Assets\StoreLogo.png" />
        <InkCanvas x:Name="inkCanvas" />
    </Grid>
</Grid>

Ez a képsorozat bemutatja, hogyan jelenik meg a tollbemenet az InkCanvas vezérlőelem által.

Képernyőkép az üres InkCanvasról háttérképpel. Képernyőkép az InkCanvasról tintacsíkokkal. Az InkCanvas képernyőképe, amelyen egy vonás törölve lett.
Az InkCanvas üres, de háttérképpel rendelkezik. Az InkCanvas, amely tollvonásokat tartalmaz. A InkCanvas egy vonással törölve (figyelje meg, hogy a törlés egy teljes vonáson működik, nem egy részen).

A InkCanvas vezérlő által támogatott rajzolási funkciót az InkPresenter nevű kód alatti objektum biztosítja.

Az alapszintű szabadkézi rajzoláshoz nem kell foglalkoznia a InkPresenter. A InkCanvas szabadkézi műveleteinek testreszabásához és konfigurálásához azonban hozzá kell férni a megfelelő InkPresenter objektumhoz.

Alapszintű testreszabás az InkPresenterrel

Minden InkCanvas vezérlőhöz egy InkPresenter objektum van példányosítva.

Megjegyzés:

A InkPresenter nem hozható létre közvetlenül. Ehelyett a InkPresenterInkCanvas tulajdonságán keresztül érhető el. 

A megfelelő InkCanvas vezérlő összes alapértelmezett tintázási viselkedésének biztosításán túl a InkPresenter átfogó API-készletet kínál a vonások további testreszabásához és a tollbemenet (standard és módosított) finomabb kezeléséhez. Ez magában foglalja a stroke tulajdonságait, a támogatott beviteli eszköztípusokat, valamint azt, hogy az objektum feldolgozta-e a bemenetet, vagy átadja-e az alkalmazásnak feldolgozás céljából.

Megjegyzés:

A szabványos tintabemenetet (akár a tollhegy, akár a radírhegy/gomb használata esetén) nem módosítják másodlagos hardveres funkcióval, például a tolltest gombjával, a jobb egérgombbal vagy hasonló mechanizmussal.

Alapértelmezés szerint az ink technológia csak tollbevitellel támogatott. Itt konfiguráljuk az InkPresentert a tollból és az egérből származó bemeneti adatok szabadkézi vonásként való értelmezéséhez. A tollvonások megjelenítéséhez a kezdeti tollvonásattribútumokat is beállítjuk az InkCanvas esetében.

Az egér- és érintéses beviteli eszközök engedélyezéséhez állítsa az InputDeviceTypes tulajdonságát az InkPresenter esetén a kívánt CoreInputDeviceTypes értékek kombinációjára.

public MainPage()
{
    this.InitializeComponent();

    // Set supported inking device types.
    inkCanvas.InkPresenter.InputDeviceTypes =
        Windows.UI.Core.CoreInputDeviceTypes.Mouse |
        Windows.UI.Core.CoreInputDeviceTypes.Pen;

    // Set initial ink stroke attributes.
    InkDrawingAttributes drawingAttributes = new InkDrawingAttributes();
    drawingAttributes.Color = Windows.UI.Colors.Black;
    drawingAttributes.IgnorePressure = false;
    drawingAttributes.FitToCurve = true;
    inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);
}

A szabadkézi tollvonás attribútumai dinamikusan állíthatók be a felhasználói beállítások vagy az alkalmazás követelményeinek megfelelően.

Itt a felhasználó a tinta színeinek listájából választhat.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel x:Name="HeaderPanel" Orientation="Horizontal" Grid.Row="0">
        <TextBlock x:Name="Header"
                   Text="Basic ink customization sample"
                   VerticalAlignment="Center"
                   Style="{ThemeResource HeaderTextBlockStyle}"
                   Margin="10,0,0,0" />
        <TextBlock Text="Color:"
                   Style="{StaticResource SubheaderTextBlockStyle}"
                   VerticalAlignment="Center"
                   Margin="50,0,10,0"/>
        <ComboBox x:Name="PenColor"
                  VerticalAlignment="Center"
                  SelectedIndex="0"
                  SelectionChanged="OnPenColorChanged">
            <ComboBoxItem Content="Black"/>
            <ComboBoxItem Content="Red"/>
        </ComboBox>
    </StackPanel>
    <Grid Grid.Row="1">
        <Image Source="Assets\StoreLogo.png" />
        <InkCanvas x:Name="inkCanvas" />
    </Grid>
</Grid>

Ezután kezeljük a kijelölt szín módosításait, és ennek megfelelően frissítjük a festővonások attribútumait.

// Update ink stroke color for new strokes.
private void OnPenColorChanged(object sender, SelectionChangedEventArgs e)
{
    if (inkCanvas != null)
    {
        InkDrawingAttributes drawingAttributes =
            inkCanvas.InkPresenter.CopyDefaultDrawingAttributes();

        string value = ((ComboBoxItem)PenColor.SelectedItem).Content.ToString();

        switch (value)
        {
            case "Black":
                drawingAttributes.Color = Windows.UI.Colors.Black;
                break;
            case "Red":
                drawingAttributes.Color = Windows.UI.Colors.Red;
                break;
            default:
                drawingAttributes.Color = Windows.UI.Colors.Black;
                break;
        };

        inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);
    }
}

Ezek a képek bemutatják, hogyan dolgozza fel és szabja testre a tollbemenetet az InkPresenter.

Képernyőkép az InkCanvas alapértelmezett fekete tollvonásokkal való ábrázolásról.

A InkCanvas alapértelmezett fekete tollvonásokkal.

Képernyőkép az InkCanvasról a felhasználó által kijelölt piros tollvonásokkal.

A InkCanvas a felhasználó által kiválasztott piros tollvonásokkal.

Ahhoz, hogy a tintázási és törlési műveleteken túli funkciókat is biztosítson, például a vonások kiválasztását, az alkalmazásnak az InkPresenter adott bemenetét kell azonosítania, hogy az feldolgozatlanul haladhasson át az alkalmazás általi kezeléshez.

Átmenő bemenet előrehaladott feldolgozáshoz

Alapértelmezés szerint az InkPresenter az összes bemenetet szabadkézi vagy radírvonásként dolgozza fel, beleértve a másodlagos hardveres eszközök által módosított bemeneteket is, például a tollhordó gombot, a jobb egérgombot vagy hasonlót. A felhasználók azonban általában további funkciókra vagy módosított viselkedésre számítanak ezekkel a másodlagos affordanciákkal.

Bizonyos esetekben előfordulhat, hogy további funkciókat is el kell érhetővé tennie azokhoz a tollakhoz, amelyek nem rendelkeznek másodlagos funkciókkal (olyan funkciók, amelyeket általában nem társítanak a tollhegyhez), más beviteli eszköztípusokhoz, vagy valamilyen módosított működéshez az alkalmazás felhasználói felületén végzett felhasználói beállítások alapján.

Ennek támogatásához az InkPresenter konfigurálható úgy, hogy az adott bemenet feldolgozatlan maradjon. Ezt a feldolgozatlan bemenetet ezután a rendszer átadja az alkalmazásnak feldolgozás céljából.

Példa – Feldolgozatlan bemenet használata a vonalvezetés kiválasztásának implementálásához

A Windows Ink platform nem nyújt beépített támogatást a módosított beviteli formát igénylő műveletekhez, mint például a vonás kiválasztás. Az ilyen funkciók támogatásához egyéni megoldást kell biztosítania az alkalmazásokban.

Az alábbi példakód (az összes kód a MainPage.xaml és MainPage.xaml.cs fájlokban található) lépésekkel engedélyezheti a tollhordógombbal (vagy a jobb egérgombbal) végzett beviteli beállításokat.

  1. Először beállítjuk a felhasználói felületet a MainPage.xaml-ben.

    Itt hozzáadunk egy vászont (a InkCanvas alatt) a kijelölési körvonal rajzolásához. Ha egy külön réteget használ a kijelölési körvonal rajzolásához, az érintetlenül hagyja az InkCanvast és annak tartalmát.

    Az üres InkCanvas képernyőképe egy mögöttes kiválasztó vászonnal.

      <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="HeaderPanel" Orientation="Horizontal" Grid.Row="0">
          <TextBlock x:Name="Header"
            Text="Advanced ink customization sample"
            VerticalAlignment="Center"
            Style="{ThemeResource HeaderTextBlockStyle}"
            Margin="10,0,0,0" />
        </StackPanel>
        <Grid Grid.Row="1">
          <!-- Canvas for displaying selection UI. -->
          <Canvas x:Name="selectionCanvas"/>
          <!-- Inking area -->
          <InkCanvas x:Name="inkCanvas"/>
        </Grid>
      </Grid>
    
  2. A MainPage.xaml.cs deklarálunk néhány globális változót, amelyek a kiválasztási felhasználói felület aspektusaira mutató hivatkozásokat tárolnak. Pontosabban a kijelölési lasszóvonal és a kijelölt vonásokat kiemelő határoló téglalap.

      // Stroke selection tool.
      private Polyline lasso;
      // Stroke selection area.
      private Rect boundingRect;
    
  3. Ezután konfiguráljuk az InkPresenter-t, hogy mind a toll, mind az egér bemeneti adatait tollvonásként értelmezze, és állítsunk be néhány kezdeti tollvonás-attribútumot, amelyeket a InkCanvas-on történő megjelenítéshez használunk.

    A legfontosabb, hogy az InkPresenterInputProcessingConfiguration tulajdonságával jelezzük, hogy az alkalmazásnak minden módosított bemenetet fel kell dolgoznia. A módosított bemenet a InputProcessingConfiguration.RightDragAction értékének InkInputRightDragAction.LeaveUnprocessed hozzárendelésével van megadva. Ha ez az érték be van állítva, az InkPresenter átmegy az InkUnprocessedInput osztályba, amely a kezelendő mutatóesemények készlete.

    Figyelőket rendelünk az InkPresenter által átadott feldolgozatlan PointerPressed, PointerMoved és PointerReleased eseményekhez. Az események kezelőiben minden kijelölési funkció implementálva van.

    Végül figyelőket rendelünk az InkPresenterStrokeStarted és StrokesErased eseményeihez. Az események kezelőivel megtisztítjuk a kijelölés felhasználói felületét, ha egy új vonás el van indítva, vagy egy meglévő vonás törlődik.

    Képernyőkép az Ink Customization mintaalkalmazásról, amelyen az alapértelmezett fekete tollvonásokkal rendelkező rajzvászon látható.

      public MainPage()
      {
        this.InitializeComponent();
    
        // Set supported inking device types.
        inkCanvas.InkPresenter.InputDeviceTypes =
          Windows.UI.Core.CoreInputDeviceTypes.Mouse |
          Windows.UI.Core.CoreInputDeviceTypes.Pen;
    
        // Set initial ink stroke attributes.
        InkDrawingAttributes drawingAttributes = new InkDrawingAttributes();
        drawingAttributes.Color = Windows.UI.Colors.Black;
        drawingAttributes.IgnorePressure = false;
        drawingAttributes.FitToCurve = true;
        inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);
    
        // By default, the InkPresenter processes input modified by
        // a secondary affordance (pen barrel button, right mouse
        // button, or similar) as ink.
        // To pass through modified input to the app for custom processing
        // on the app UI thread instead of the background ink thread, set
        // InputProcessingConfiguration.RightDragAction to LeaveUnprocessed.
        inkCanvas.InkPresenter.InputProcessingConfiguration.RightDragAction =
            InkInputRightDragAction.LeaveUnprocessed;
    
        // Listen for unprocessed pointer events from modified input.
        // The input is used to provide selection functionality.
        inkCanvas.InkPresenter.UnprocessedInput.PointerPressed +=
            UnprocessedInput_PointerPressed;
        inkCanvas.InkPresenter.UnprocessedInput.PointerMoved +=
            UnprocessedInput_PointerMoved;
        inkCanvas.InkPresenter.UnprocessedInput.PointerReleased +=
            UnprocessedInput_PointerReleased;
    
        // Listen for new ink or erase strokes to clean up selection UI.
        inkCanvas.InkPresenter.StrokeInput.StrokeStarted +=
            StrokeInput_StrokeStarted;
        inkCanvas.InkPresenter.StrokesErased +=
            InkPresenter_StrokesErased;
      }
    
  4. Ezután definiáljuk az InkPresenter által átadott feldolgozatlan PointerPressed, PointerMoved és PointerReleased események kezelőit.

    Minden kijelölési funkció implementálva van ezekben a kezelőkben, beleértve a lasszó vonalat és a keretező téglalapot.

    Képernyőkép a kijelölési lasszóról.

      // Handle unprocessed pointer events from modified input.
      // The input is used to provide selection functionality.
      // Selection UI is drawn on a canvas under the InkCanvas.
      private void UnprocessedInput_PointerPressed(
        InkUnprocessedInput sender, PointerEventArgs args)
      {
        // Initialize a selection lasso.
        lasso = new Polyline()
        {
            Stroke = new SolidColorBrush(Windows.UI.Colors.Blue),
            StrokeThickness = 1,
            StrokeDashArray = new DoubleCollection() { 5, 2 },
            };
    
            lasso.Points.Add(args.CurrentPoint.RawPosition);
    
            selectionCanvas.Children.Add(lasso);
        }
    
        private void UnprocessedInput_PointerMoved(
          InkUnprocessedInput sender, PointerEventArgs args)
        {
          // Add a point to the lasso Polyline object.
          lasso.Points.Add(args.CurrentPoint.RawPosition);
        }
    
        private void UnprocessedInput_PointerReleased(
          InkUnprocessedInput sender, PointerEventArgs args)
        {
          // Add the final point to the Polyline object and
          // select strokes within the lasso area.
          // Draw a bounding box on the selection canvas
          // around the selected ink strokes.
          lasso.Points.Add(args.CurrentPoint.RawPosition);
    
          boundingRect =
            inkCanvas.InkPresenter.StrokeContainer.SelectWithPolyLine(
              lasso.Points);
    
          DrawBoundingRect();
        }
    
  5. A PointerReleased eseménykezelő befejezéséhez töröljük az összes tartalom kijelölési sávját (a lasszóvonást), majd egyetlen határoló téglalapot rajzolunk a lasszó terület által körülelt tintavonások köré.

    Képernyőkép a kijelölési határoló téglalapról.

      // Draw a bounding rectangle, on the selection canvas, encompassing
      // all ink strokes within the lasso area.
      private void DrawBoundingRect()
      {
        // Clear all existing content from the selection canvas.
        selectionCanvas.Children.Clear();
    
        // Draw a bounding rectangle only if there are ink strokes
        // within the lasso area.
        if (!((boundingRect.Width == 0) ||
          (boundingRect.Height == 0) ||
          boundingRect.IsEmpty))
          {
            var rectangle = new Rectangle()
            {
              Stroke = new SolidColorBrush(Windows.UI.Colors.Blue),
                StrokeThickness = 1,
                StrokeDashArray = new DoubleCollection() { 5, 2 },
                Width = boundingRect.Width,
                Height = boundingRect.Height
            };
    
            Canvas.SetLeft(rectangle, boundingRect.X);
            Canvas.SetTop(rectangle, boundingRect.Y);
    
            selectionCanvas.Children.Add(rectangle);
          }
        }
    
  6. Végül definiáljuk a StrokeStarted és a StrokesErased InkPresenter események kezelőit.

    Mindkettő ugyanazt a törlési függvényt hívja meg, hogy törölje az aktuális kijelölést, amikor új körvonalat észlel.

      // Handle new ink or erase strokes to clean up selection UI.
      private void StrokeInput_StrokeStarted(
        InkStrokeInput sender, Windows.UI.Core.PointerEventArgs args)
      {
        ClearSelection();
      }
    
      private void InkPresenter_StrokesErased(
        InkPresenter sender, InkStrokesErasedEventArgs args)
      {
        ClearSelection();
      }
    
  7. Az alábbi függvény eltávolítja az összes kijelölési felhasználói felületet a kijelölési vászonról egy új vonás indításakor vagy egy meglévő vonás törlésekor.

      // Clean up selection UI.
      private void ClearSelection()
      {
        var strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
        foreach (var stroke in strokes)
        {
          stroke.Selected = false;
        }
        ClearDrawnBoundingRect();
       }
    
      private void ClearDrawnBoundingRect()
      {
        if (selectionCanvas.Children.Any())
        {
          selectionCanvas.Children.Clear();
          boundingRect = Rect.Empty;
        }
      }
    

Egyedi tinta renderelés

A tintabemenet alapértelmezés szerint egy kis késésű háttérszálon dolgozódik fel, és a rajzolás közben, "nedves" állapotban jelenik meg. Amikor a tollvonás befejeződik (a toll vagy az ujj fel van emelve, vagy az egérgomb felengedve), a vonást a felhasználói felületi szálon dolgozzák fel, és "szárazként" a InkCanvas rétegre jelenítik meg, az alkalmazás tartalma fölé, miközben lecseréli a nedves tintát.

Felülírhatja ezt az alapértelmezett viselkedést, és teljes mértékben irányíthatja a festési élményt a nedves tintavonások "egyéni szárításával". Bár az alapértelmezett viselkedés általában elegendő a legtöbb alkalmazáshoz, van néhány olyan eset, amikor egyéni szárításra lehet szükség, ezek a következők:

  • Nagyméretű vagy összetettebb tollvonások gyűjteményeinek hatékonyabb kezelése
  • Hatékonyabb pásztázási és nagyítási támogatás nagy tintás vászon esetén
  • A tintavonalak és egyéb objektumok, például alakzatok vagy szöveg egymásba fonódása a z-sorrend fenntartása mellett
  • A tinta szárítása és alakítása szinkronban DirectX alakzattá (például egy egyenes vonal vagy alakzat, amely raszterizálva és az alkalmazás tartalmába integrálva van, nem pedig különálló InkCanvas rétegként).

Az egyéni szárításhoz egy IInkD2DRenderer objektum szükséges a tinta bemenet kezelésére és az univerzális Windows alkalmazásának Direct2D eszközkörnyezetében való megjelenítésére az alapértelmezett InkCanvas vezérlőelem helyett.

A ActivateCustomDrying meghívásával (mielőtt a InkCanvas be van töltve), az alkalmazás létrehoz egy InkSynchronizer objektumot annak érdekében, hogy testreszabja, hogyan lesz a tinta vonás szárazra jelenítve a SurfaceImageSource-re vagy a VirtualSurfaceImageSource-ra.

A SurfaceImageSource és VirtualSurfaceImageSource directX megosztott felületet biztosít az alkalmazásnak az alkalmazás tartalmába való be- és beírásához, bár a VSIS egy olyan virtuális felületet biztosít, amely nagyobb, mint a képernyő a teljesítménybeli pásztázáshoz és a nagyításhoz. Mivel ezeknek a felületeknek a vizuális frissítései szinkronizálva vannak az XAML felhasználói felületi szálával, a szabadkézi elemek bármelyikére való megjelenítésekor a nedves szabadkézi elemek egyidejűleg eltávolíthatók az InkCanvasból.

Egyéni beállítású tintát is alkalmazhat a SwapChainPanel-en, de a felhasználói felület szálával való szinkronizálás nem garantált, és előfordulhat késés a tinta SwapChainPanelre történő renderelése és az InkCanvasból való eltávolítása között.

Ennek a funkciónak a teljes példájáért tekintse meg a Complex tintamintát.

Megjegyzés:

Egyéni szárítás és az InkToolbar
Ha az alkalmazás felülírja a InkPresenter alapértelmezett szabadkézi megjelenítési viselkedését egy egyéni szárítási implementációval, a renderelt szabadkézi vonások már nem érhetők el az InkToolbar számára, és az InkToolbar beépített törlési parancsai nem működnek a várt módon. A törlési funkció biztosításához kezelnie kell az összes mutatóeseményt, el kell végeznie a találattesztelést minden egyes vonáson, és felül kell bírálnia a beépített "Az összes szabadkézi elem törlése" parancsot.

Téma Leírás
Tintavonások felismerése A szabadkézi vonásokat szöveggé alakíthatja kézírás-felismeréssel, vagy alakzatokká egyedi felismeréssel.
Tollvonások tárolása és visszakeresése Beágyazott Ink Serialized Format (ISF) metaadatokat használva tárolhatja a tintavonásadatokat egy GIF-fájlban.
InkToolbar hozzáadása Windows szabadkézési alkalmazáshoz Adjon hozzá egy alapértelmezett InkToolbart egy Windows alkalmazásbeli szabadkézési alkalmazáshoz, adjon hozzá egy egyéni tollgombot az InkToolbarhoz, és kösse az egyéni toll gombot egy egyéni tolldefinícióhoz.

API-k

Példák

Archivált minták