Udostępnij przez


Interakcje pióra i Windows Ink w aplikacjach Windows

Obraz bohatera pióra Surface.
Pióro Surface (dostępne do zakupu w Sklepie Microsoft).

Przegląd

Zoptymalizuj aplikację systemu Windows pod kątem obsługi pióra, aby zapewnić zarówno standardową funkcjonalność urządzenia wskaźnika, jak i najlepsze doświadczenie Windows Ink dla użytkowników.

Uwaga / Notatka

Ten temat koncentruje się na platformie Windows Ink. Aby uzyskać ogólną obsługę danych wejściowych wskaźnika (podobną do myszy, dotyku i touchpadu), zobacz Handle pointer input (Obsługa danych wejściowych wskaźnika).

Korzystanie z tuszu w aplikacji systemu Windows

Wykorzystaj Pióro Windows i Pismo Cyfrowe, aby tworzyć bardziej angażujące aplikacje dla przedsiębiorstw

Platforma Windows Ink wraz z urządzeniem piórowym zapewnia naturalny sposób tworzenia cyfrowych notatek, rysunków i adnotacji odręcznych. Platforma obsługuje przechwytywanie danych wejściowych digitalizatora jako danych tuszu, generowanie danych tuszu, zarządzanie danymi tuszu, renderowanie danych tuszu jako pociągnięć atramentu na urządzeniach wyjściowych i konwertowanie pisma odręcznego na tekst za pomocą rozpoznawania pisma odręcznego.

Oprócz przechwytywania podstawowej pozycji i ruchu pióra, gdy użytkownik pisze lub rysuje, aplikacja może również śledzić i zbierać zmieniające się poziomy nacisku podczas całego pociągnięcia. Te informacje, wraz z ustawieniami kształtu, rozmiaru i rotacji końcówki pióra, koloru atramentu i przeznaczenia (zwykły atrament, wymazywanie, wyróżnianie i wybieranie), umożliwiają zapewnienie użytkownikom środowisk, które bardzo przypominają pisanie lub rysowanie na papierze za pomocą pióra, ołówka lub pędzla.

Uwaga / Notatka

Aplikacja może również obsługiwać wprowadzanie pisma odręcznego z innych urządzeń opartych na wskaźnikach, w tym ekranów dotykowych i myszy. 

Platforma tuszowa jest bardzo elastyczna. Jest przeznaczony do obsługi różnych poziomów funkcjonalności, w zależności od wymagań.

Aby uzyskać wskazówki dotyczące interfejsu użytkownika funkcji Windows Ink, zobacz Kontrolki pisma odręcznego.

Składniki platformy Windows Ink

Składnik Description
InkCanvas Kontrolka platformy XAML, która domyślnie odbiera i wyświetla wszystkie sygnały wejściowe z pióra jako pociągnięcia pisma odręcznego lub pociągnięcia wymazywania.
Aby uzyskać więcej informacji na temat korzystania z InkCanvas, zobacz Rozpoznawanie śladów Windows Ink jako tekstu i Przechowywanie i pobieranie danych śladów Windows Ink.
InkPresenter Obiekt związany z kodem powiązany z kontrolką InkCanvas (dostępną poprzez właściwość InkCanvas.InkPresenter). Ten obiekt udostępnia wszystkie domyślne funkcje pisma odręcznego udostępniane przez aplikację InkCanvas wraz z kompleksowym zestawem interfejsów API na potrzeby dodatkowego dostosowywania i personalizacji.
Aby uzyskać więcej informacji na temat korzystania z InkPresenter, zobacz Rozpoznawanie pociągnięć pióra systemu Windows jako tekstu i Przechowywanie i pobieranie danych pociągnięcia pióra systemu Windows.
Narzędzie InkToolbar Kontrolka platformy interfejsu użytkownika XAML zawierająca dostosowywalną i rozszerzalną kolekcję przycisków, które aktywują funkcje związane z atramentem w skojarzonym inkCanvas.
Aby uzyskać więcej informacji na temat korzystania z narzędzia InkToolbar, zobacz Dodawanie paska narzędzi inkToolbar do aplikacji pisma odręcznego systemu Windows.
IInkD2DRenderer Umożliwia renderowanie pociągnięć atramentu na wyznaczonym kontekście urządzenia Direct2D aplikacji uniwersalnej Windows, zamiast domyślnej kontrolki InkCanvas. Umożliwia to pełne dostosowanie obsługi pisma odręcznego.
Aby uzyskać więcej informacji, zobacz przykład złożonego atramentu.

Podstawowe pisanie odręczne za pomocą narzędzia InkCanvas

Aby dodać podstawową funkcjonalność pisma odręcznego, wystarczy umieścić kontrolkę platformy UWP InkCanvas na odpowiedniej stronie w aplikacji.

Domyślnie InkCanvas obsługuje pismo odręczne tylko z pióra. Dane wejściowe są przedstawiane jako kreska przy użyciu domyślnych ustawień dla koloru i grubości (czarnym piórem kulkowym o grubości 2 pikseli) lub traktowane jako gumka do pociągnięć (gdy dane wejściowe pochodzą z końcówki gumki lub końcówki pióra zmodyfikowanej przyciskiem do wymazywania).

Uwaga / Notatka

Jeśli nie ma końcówki lub przycisku gumki, można skonfigurować inkCanvas do przetwarzania danych wejściowych z końcówki pióra jako pociągnięcia wymazywania.

W tym przykładzie inkCanvas nakłada obraz tła.

Uwaga / Notatka

Kontrolka InkCanvas ma domyślne właściwości Height i Width o wartości zero, chyba że jest elementem podrzędnym elementu, który automatycznie określa rozmiar elementów podrzędnych, takich jak StackPanel lub Kontrolka Grid .

<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>

Seria obrazów pokazuje, jak wprowadzanie pióra jest renderowane przez kontrolkę InkCanvas.

Zrzut ekranu przedstawiający pusty komponent InkCanvas z obrazem tła. Zrzut ekranu przedstawiający InkCanvas z pociągnięciami tuszem. Zrzut ekranu przedstawiający wymazywanie inkCanvas z jednym pociągnięciem.
Pusty InkCanvas z obrazem tła. InkCanvas z pociągnięciami tuszu. Zwróć uwagę, że InkCanvas jest wymazywane jednym pociągnięciem (dotyczy to całego pociągnięcia, a nie jego części).

Funkcjonalność pisma odręcznego obsługiwana przez kontrolkę InkCanvas jest realizowana przez obiekt typu code-behind o nazwie InkPresenter.

W przypadku podstawowego pisma odręcznego nie musisz martwić się o InkPresenter. Jednak aby dostosować i skonfigurować zachowanie pisma odręcznego w usłudze InkCanvas, należy uzyskać dostęp do odpowiedniego obiektu InkPresenter .

Dostosowywanie podstawowe za pomocą narzędzia InkPresenter

Obiekt InkPresenter jest tworzony dla każdej kontrolki InkCanvas.

Uwaga / Notatka

Nie można bezpośrednio utworzyć wystąpienia elementu InkPresenter. Zamiast tego jest on dostępny za pośrednictwem właściwości InkPresenterinkCanvas

Wraz z zapewnieniem wszystkich domyślnych zachowań pisma odręcznego odpowiadającej jej kontrolce InkCanvas usługa InkPresenter udostępnia kompleksowy zestaw interfejsów API na potrzeby dodatkowego dostosowywania pociągnięcia i bardziej szczegółowego zarządzania danymi wejściowymi pióra (standard i modyfikacja). Obejmuje to właściwości pociągnięcia, obsługiwane typy urządzeń wejściowych oraz informacje o tym, czy dane wejściowe są przetwarzane przez obiekt, czy przekazywane do aplikacji na potrzeby przetwarzania.

Uwaga / Notatka

Standardowe wejście pisma odręcznego (z końcówki pióra lub gumki) nie jest modyfikowane dodatkowym elementem sprzętowym, takim jak przycisk na obudowie pióra, prawy przycisk myszy lub podobny mechanizm.

Domyślnie atrament jest obsługiwany tylko dla obsługi rysika. W tym miejscu skonfigurujemy narzędzie InkPresenter do interpretowania danych wejściowych zarówno z pióra, jak i myszy jako pociągnięć atramentu. Ustawiamy również niektóre początkowe atrybuty pociągnięcia pisma odręcznego, używane do renderowania pociągnięć do InkCanvas.

Aby włączyć pisanie odręczne za pomocą myszy i dotyku, ustaw właściwość InputDeviceTypes elementu InkPresenter na kombinację żądanych wartości CoreInputDeviceTypes.

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);
}

Atrybuty pociągnięcia pisma odręcznego można ustawić dynamicznie, aby uwzględnić preferencje użytkownika lub wymagania aplikacji.

Tutaj pozwalamy użytkownikowi wybrać z listy kolorów tuszu.

<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>

Następnie obsługujemy zmiany wybranego koloru i odpowiednio aktualizujemy atrybuty śladu pióra.

// 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);
    }
}

Te obrazy pokazują, jak dane wejściowe pióra są przetwarzane i dostosowywane przez inkPresenter.

Zrzut ekranu przedstawiający InkCanvas z czarnymi domyślnymi pociągnięciami pędzla.

InkCanvas z domyślnymi czarnymi kreskami.

Zrzut ekranu przedstawiający InkCanvas z wybranymi czerwonymi rysunkami tuszem.

InkCanvas z wybranymi przez użytkownika czerwonymi pociągnięciami atramentu.

Aby zapewnić funkcjonalność poza wprowadzaniem atramentu i wymazywaniem, takie jak wybór pociągnięcia, aplikacja musi zidentyfikować określone dane wejściowe dla InkPresenter, aby przekazywać je nieprzetworzone do obsługi przez aplikację.

Dane wejściowe przekazywane do przetwarzania zaawansowanego

Domyślnie InkPresenter przetwarza wszystkie dane wejściowe jako pociągnięcie pisma lub pociągnięcie wymazywania, w tym dane wejściowe zmienione przez dodatkowy przycisk sprzętowy, taki jak przycisk na obudowie pióra, prawy przycisk myszy lub podobne. Jednak użytkownicy zwykle oczekują pewnych dodatkowych funkcji lub zmodyfikowanego zachowania w związku z tymi pomocniczymi funkcjami.

W niektórych przypadkach może być również konieczne uwidocznienie dodatkowych funkcji piór bez dodatkowych funkcji (funkcjonalność nie jest zwykle kojarzona z końcówką pióra), innych typów urządzeń wejściowych lub pewnego typu zmodyfikowanego zachowania w oparciu o wybór użytkownika w interfejsie aplikacji.

Aby to umożliwić, można skonfigurować moduł InkPresenter tak, aby pozostawić określone dane wejściowe nieprzetworzone. Te nieprzetworzone dane wejściowe są następnie przekazywane do aplikacji na potrzeby przetwarzania.

Przykład — użycie nieprzetworzonych danych wejściowych do implementacji wyboru obrysu

Platforma Windows Ink nie zapewnia wbudowanej obsługi działań wymagających zmodyfikowanego wejścia, takich jak wybór śladu. Aby obsługiwać te funkcje, musisz udostępnić niestandardowe rozwiązanie w swojej aplikacji.

Poniższy przykład kodu (cały kod znajduje się w plikach MainPage.xaml i MainPage.xaml.cs) zawiera instrukcje włączania zaznaczenia pociągnięcia po zmodyfikowaniu danych wejściowych za pomocą przycisku beczki pióra (lub prawego przycisku myszy).

  1. Najpierw skonfigurujemy interfejs użytkownika w pliku MainPage.xaml.

    W tym miejscu dodajemy kanwę (poniżej InkCanvas), aby narysować pociągnięcie zaznaczenia. Użycie oddzielnej warstwy do narysowania pociągnięcia zaznaczenia pozostawia InkCanvas i jego zawartość nietkniętą.

    Zrzut ekranu pustego InkCanvas z leżącą pod nim kanwą wyboru.

      <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. W MainPage.xaml.cs deklarujemy kilka zmiennych globalnych do przechowywania odwołań do aspektów interfejsu użytkownika wyboru. Konkretnie, gest zaznaczenia lasso i prostokąt obrysowy, który podkreśla zaznaczone pociągnięcia.

      // Stroke selection tool.
      private Polyline lasso;
      // Stroke selection area.
      private Rect boundingRect;
    
  3. Następnie skonfigurujemy narzędzie InkPresenter do interpretowania danych wejściowych zarówno z pióra, jak i myszy jako pociągnięć pisma odręcznego, oraz ustawiamy niektóre początkowe atrybuty pociągnięcia pisma odręcznego używane do renderowania pociągnięć do inkCanvas.

    Co najważniejsze, używamy właściwości InputProcessingConfigurationinkPresenter , aby wskazać, że wszystkie zmodyfikowane dane wejściowe powinny być przetwarzane przez aplikację. Zmodyfikowane dane wejściowe są określane przez przypisanie parametru InputProcessingConfiguration.RightDragAction jako wartość InkInputRightDragAction.LeaveUnprocessed. Po ustawieniu tej wartości InkPresenter przekazuje do klasy InkUnprocessedInput zestaw zdarzeń wskaźnika, które można obsłużyć.

    Przypisujemy nasłuchiwacze dla nieprzetworzonych zdarzeń PointerPressed, PointerMoved i PointerReleased obsługiwanych przez InkPresenter. Wszystkie funkcje wyboru są implementowane w modułach obsługi dla tych zdarzeń.

    Na koniec przypisujemy nasłuchiwacze dla zdarzeń StrokeStarted i StrokesErasedInkPresenter. Procedury obsługi tych zdarzeń służą do czyszczenia interfejsu zaznaczeń, gdy rozpoczynane jest nowe pociągnięcie lub usuwane jest istniejące.

    Zrzut ekranu przykładowej aplikacji do dostosowywania pisma odręcznego, pokazujący płótno z domyślnymi czarnymi pociągnięciami atramentu.

      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. Następnie definiujemy programy obsługi dla nieprzetworzonych zdarzeń PointerPressed, PointerMoved i PointerReleased przekazywane przez InkPresenter.

    Wszystkie funkcje wyboru są implementowane w tych procedurach obsługi, w tym pociągnięcie lasso i prostokąt ograniczający.

    Zrzut ekranu narzędzia Lasso.

      // 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. Aby zakończyć procedurę obsługi zdarzeń PointerReleased, wyczyścimy warstwę zaznaczenia zawartości ścieżki lasso, a następnie narysujemy pojedynczy prostokąt ograniczający wokół pociągnięć tuszem znajdujących się w obszarze lasso.

    Zrzut ekranu przedstawiający prostokąt ograniczający zaznaczenie.

      // 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. Na koniec definiujemy procedury obsługi dla zdarzeń StrokeStarted i StrokesErased InkPresenter.

    Obie te funkcje po prostu wywołują tę samą funkcję czyszczenia, aby wyczyścić bieżące zaznaczenie za każdym razem, gdy zostanie wykryte nowe pociągnięcie.

      // 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. Oto funkcja usuwania całego interfejsu zaznaczenia z płótna, gdy rozpoczynane jest nowe pociągnięcie lub usuwane jest istniejące pociągnięcie.

      // 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;
        }
      }
    

Niestandardowe renderowanie atramentu

Domyślnie dane wejściowe pióra są przetwarzane na wątku w tle o niskiej latencji i renderowane na bieżąco, czyli "mokre", podczas rysowania. Po ukończeniu pociągnięcia (gdy pióro lub palec zostanie uniesiony lub przycisk myszy zwolniony), pociągnięcie jest przetwarzane na wątku interfejsu użytkownika i renderowane jako „suche” na warstwie InkCanvas (umieszczonej powyżej zawartości aplikacji, zastępując mokry atrament).

Możesz zmienić to domyślne zachowanie i całkowicie kontrolować proces pisania odręcznego przez "niestandardowe suszenie" mokrych atramentowych pociągnięć. Chociaż zachowanie domyślne jest zwykle wystarczające dla większości aplikacji, istnieje kilka przypadków, w których może być wymagane niestandardowe suszenie, są to między innymi:

  • Bardziej wydajne zarządzanie dużymi lub złożonymi zestawami ścieżek atramentu
  • Wydajniejsza obsługa przesuwania i powiększania na dużych kompozycjach atramentowych
  • Przeplatanie tuszu i innych obiektów, takich jak kształty lub tekst, przy zachowaniu porządku Z
  • Suszenie i konwersja atramentu synchronicznie na kształt DirectX (np. linia prosta lub kształt, który jest zasteryzowany i zintegrowany z zawartością aplikacji, zamiast być osobną warstwą InkCanvas).

Niestandardowe suszenie wymaga obiektu IInkD2DRenderer do zarządzania danymi wejściowymi pisma odręcznego i renderowania go w kontekście urządzenia Direct2D aplikacji uniwersalnej systemu Windows zamiast domyślnej kontrolki InkCanvas .

Wywołując ActivateCustomDrying (przed załadowaniem InkCanvas), aplikacja tworzy obiekt InkSynchronizer, aby dostosować proces wysychania i renderowania pociągnięcia pisma do SurfaceImageSource lub VirtualSurfaceImageSource.

Zarówno SurfaceImageSource, jak i VirtualSurfaceImageSource zapewniają udostępnioną powierzchnię DirectX dla aplikacji do rysowania i komponowania zawartości aplikacji, chociaż VSIS udostępnia wirtualną powierzchnię większą niż ekran dla wydajnego panoramowania i zoomu. Ponieważ aktualizacje wizualizacji tych powierzchni są synchronizowane z wątkiem interfejsu użytkownika XAML, po renderowaniu pisma odręcznego do dowolnego z nich można jednocześnie usunąć mokry atrament z inkCanvas.

Możesz również niestandardowo renderować suchy atrament na SwapChainPanel, ale synchronizacja z wątkiem interfejsu użytkownika nie jest gwarantowana i może wystąpić opóźnienie między renderowaniem pisma odręcznego na SwapChainPanel a usunięciem pisma odręcznego z InkCanvas.

Aby zapoznać się z pełnym przykładem tej funkcjonalności, zobacz złożony przykład tuszu.

Uwaga / Notatka

Niestandardowe suszenie i narzędzie InkToolbar
Jeśli aplikacja zastępuje domyślne zachowanie renderowania pisma odręcznego w narzędziu InkPresenter niestandardową implementacją wysychania, renderowane pociągnięcia pisma odręcznego nie są już dostępne dla InkToolbar, a wbudowane polecenia wymazywania InkToolbar nie działają zgodnie z oczekiwaniami. Aby zapewnić funkcjonalność wymazywania, należy obsługiwać wszystkie zdarzenia wskaźnika, wykonywać testy trafień na każdym pociągnięciu i zastępować wbudowane polecenie "Wymaż wszystkie atramenty".

Temat Description
Rozpoznawanie pociągnięć atramentu Konwertuj pociągnięcia pisma odręcznego do tekstu przy użyciu rozpoznawania pisma odręcznego lub do kształtów za pomocą rozpoznawania na zamówienie.
Przechowywanie i pobieranie pociągnięć pisma odręcznego Przechowywanie danych pociągnięć pióra odręcznego w pliku GIF (Graphics Interchange Format) przy użyciu osadzonych metadanych formatu Ink Serialized Format (ISF).
Dodaj pasek narzędzi InkToolbar do aplikacji do pisania odręcznego w systemie Windows Dodaj domyślny pasek inkToolbar do aplikacji odręcznej systemu Windows, dodaj niestandardowy przycisk pióra do paska InkToolbar i powiąż niestandardowy przycisk pióra z niestandardową definicją pióra.

API-e

Samples

Archiwalne przykłady