Windows uygulamalarında kalem etkileşimleri ve Windows Mürekkep

Surface Pen'in ön plana çıkan görüntüsü.
Surface Pen (Microsoft Store) adresinden satın alınabilir).

Genel bakış

Windows uygulamanızı kalem girişi için iyileştirerek hem standart pointer cihazı işlevselliğini hem de kullanıcılarınız için en iyi Windows Mürekkep deneyimini sağlayın.

Uyarı

Bu konu, Windows Ink platformuna odaklanır. Genel işaretçi girişi işleme (fare, dokunma ve dokunmatik yüzeye benzer) için bkz. İşaretçi girişini işleme.

Windows Ink platformu, kalem cihazıyla birlikte dijital el yazısı notlar, çizimler ve ek açıklamalar oluşturmak için doğal bir yol sağlar. Platform, mürekkep verileri olarak dijital hale getirici girişini yakalamayı, mürekkep verileri oluşturmayı, mürekkep verilerini yönetmeyi, mürekkep verilerini çıkış cihazında mürekkep vuruşu olarak işlemeyi ve el yazısı tanıma aracılığıyla mürekkepleri metne dönüştürmeyi destekler.

Kullanıcı yazarken veya çizerken kalemin temel konumunu ve hareketini yakalamanın yanı sıra, uygulamanız bir vuruş boyunca kullanılan çeşitli basınç miktarlarını da izleyebilir ve toplayabilir. Kalem ucu şekli, boyutu ve döndürme, mürekkep rengi ve amacı (düz mürekkep, silme, vurgulama ve seçme) ayarlarıyla birlikte bu bilgiler, kalem, kalem veya fırçayla kağıt üzerinde yazmaya veya çizmeye çok benzeyen kullanıcı deneyimleri sağlamanıza olanak tanır.

Uyarı

Uygulamanız, dokunmatik basamaklandırıcılar ve fare cihazları da dahil olmak üzere diğer işaretçi tabanlı cihazlardan mürekkep girişini de destekleyebilir. 

Mürekkep platformu çok esnektir. Gereksinimlerinize bağlı olarak çeşitli işlev düzeylerini destekleyecek şekilde tasarlanmıştır.

Windows Ink UX yönergeleri için bkz. Inking kontrolleri.

Windows Ink platformunun bileşenleri

Bileşen Açıklama
InkCanvas Kalemden gelen tüm girişleri varsayılan olarak mürekkep vuruşu veya silme işlemi olarak alan ve görüntüleyen bir XAML UI platformu denetimi.
InkCanvas'ı nasıl kullanacağınız hakkında daha fazla bilgi için bkz. Windows Mürekkep vuruşlarını metin olarak tanıma ve Windows Mürekkep vuruşu verilerini depolama ve alma.
InkPresenter InkCanvas denetimiyle birlikte örneklenen bir arka plan kod nesnesi (InkCanvas.InkPresenter özelliği aracılığıyla). Bu nesne , InkCanvas tarafından kullanıma sunulan tüm varsayılan mürekkep oluşturma işlevlerinin yanı sıra ek özelleştirme ve kişiselleştirme için kapsamlı bir API kümesi sağlar.
InkPresenter'ı kullanma hakkında daha fazla bilgi için bkz. >Windows Mürekkep vuruşlarını metin olarak kodlama ve >Windows Mürekkep vuruşu verilerini alma.
InkToolbar İlişkili bir InkCanvas'ta mürekkeple ilgili özellikleri etkinleştiren özelleştirilebilir ve genişletilebilir düğme koleksiyonunu içeren bir XAML UI platform denetimi.
InkToolbar'ı kullanma hakkında daha fazla bilgi için bkz. Windows uygulaması mürekkep oluşturma uygulamasına InkToolbar ekleme.
IInkD2DRenderer Mürekkep vuruşlarının, varsayılan InkCanvas denetimi yerine Evrensel Windows uygulamasının belirlenen Direct2D aygıt bağlamında işlenmesini mümkün kılar. Bu, mürekkep oluşturma deneyiminin tam özelleştirmesini sağlar.
Daha fazla bilgi için bkz. Complex mürekkep örneği.

InkCanvas ile temel mürekkep kullanımı

Temel mürekkep oluşturma işlevselliği eklemek için uygulamanızın uygun sayfasına bir InkCanvas UWP platform denetimi yerleştirmeniz gerekir.

Varsayılan olarak, InkCanvas yalnızca kalemden mürekkep girişini destekler. Giriş, ya renk ve kalınlık için varsayılan ayarlarla (2 piksel kalınlığında siyah tükenmez kalem) mürekkep çizgisi olarak işlenir ya da vuruş silgisi olarak işlem görür (giriş, silgi ucundan geldiğinde veya kalem ucundaki silme düğmesiyle değiştirildiğinde).

Uyarı

Bir silgi ucu veya düğmesi yoksa, InkCanvas kalem ucundan gelen girişleri silme işlemi olarak işlenecek şekilde yapılandırılabilir.

Bu örnekte, bir InkCanvas bir arka plan görüntüsünün üzerine yerleştirilir.

Uyarı

InkCanvas, StackPanel veya Grid denetimleri gibi alt öğelerini otomatik olarak boyutlandıran bir öğenin alt öğesi olmadığı sürece sıfır olan varsayılan Yükseklik ve Genişlik özelliklerine sahiptir.

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

Bu görüntü serisi, kalem girişinin bu InkCanvas denetimi tarafından nasıl işlendiğini gösterir.

Arka plan resmi olan boş InkCanvas'ın ekran görüntüsü. Mürekkep vuruşlu InkCanvas'ın ekran görüntüsü. Tek vuruşlu InkCanvas'ın ekran görüntüsü silindi.
Arka plan görüntüsüyle boş InkCanvas. Mürekkep vuruşlarıyla InkCanvas. InkCanvas tek vuruşla silinir (silme işleminin bir kısımda değil tüm vuruşta nasıl çalıştığını unutmayın).

InkCanvas denetimi tarafından desteklenen mürekkep oluşturma işlevi, InkPresenter adlı arka plan kod nesnesi tarafından sağlanır.

Temel mürekkep oluşturma için InkPresenter ile ilgilenmeniz gerekmez. Ancak, InkCanvas üzerinde mürekkep oluşturma davranışını özelleştirmek ve yapılandırmak için, ilgili InkPresenter nesnesine erişmeniz gerekir.

InkPresenter ile temel özelleştirme

InkPresenter nesnesi her InkCanvas denetimiyle oluşturulur.

Uyarı

InkPresenter'ın doğrudan örneklemesi yapılamaz. Bunun yerine, InkCanvasInkPresenter özelliği aracılığıyla erişilir. 

İlgili InkCanvas denetiminin tüm varsayılan mürekkep oluşturma davranışlarını sağlamanın yanı sıra, InkPresenter ek vuruş özelleştirmesi ve kalem girişinin daha ayrıntılı yönetimi için kapsamlı bir API kümesi sağlar (standart ve değiştirilmiş). Buna vuruş özellikleri, desteklenen giriş cihazı türleri ve girişin nesne tarafından işlenip işlenmediği veya işleme için uygulamaya geçirilip geçirilmediği dahildir.

Uyarı

Standart mürekkep girişi (kalemin ucu veya silgi ucu/düğmesinden) kalem gövde düğmesi, sağ fare düğmesi veya benzeri bir mekanizma gibi ikincil donanım desteği ile değiştirilmez.

Mürekkep varsayılan olarak yalnızca kalem girişi için desteklenir. Burada InkPresenter'ı hem kalemden hem de fareden gelen giriş verilerini mürekkep vuruşları olarak yorumacak şekilde yapılandıracağız. InkCanvas için vuruşları işlemek için kullanılan bazı ilk mürekkep vuruşu özniteliklerini de ayarladık.

Fare ve dokunmatik mürekkep oluşturmayı etkinleştirmek için InkPresenter'ınInputDeviceTypes özelliğini istediğiniz CoreInputDeviceTypes değerlerinin birleşimine ayarlayın.

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

Mürekkep vuruşu öznitelikleri, kullanıcı tercihlerini veya uygulama gereksinimlerini karşılamak için dinamik olarak ayarlanabilir.

Burada, kullanıcının mürekkep renkleri listesinden seçim yapmasına izin veririz.

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

Ardından seçili renk değişikliklerini işleyip mürekkep vuruşu özniteliklerini uygun şekilde güncelleştiriyoruz.

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

Bu görüntülerde kalem girişinin InkPresenter tarafından nasıl işlendiği ve özelleştirileceği gösterilmektedir.

Varsayılan siyah mürekkep vuruşlarıyla InkCanvas'ın gösterildiği ekran görüntüsü.

Varsayılan siyah mürekkep vuruşlarına sahip InkCanvas.

Kullanıcı tarafından seçilen kırmızı mürekkep vuruşlarıyla InkCanvas'ın ekran görüntüsü.

Kullanıcının seçtiği kırmızı mürekkep vuruşlarına sahip InkCanvas.

Uygulamanızın mürekkepleme ve silmenin ötesinde, örneğin vuruş seçimi gibi işlevler sağlaması için, işlenmeden uygulamanız tarafından ele alınacak şekilde InkPresenter aracılığıyla geçmesi gereken belirli girişleri tanıması gerekir.

Gelişmiş işleme için doğrudan veri girişi

Varsayılan olarak, InkPresenter kalem varil düğmesi, sağ fare düğmesi veya benzeri donanımlar gibi ikincil bir donanım özelliği tarafından değiştirilen girişler de dahil olmak üzere tüm girişleri mürekkep çizimi veya silme çizimi olarak işler. Ancak kullanıcılar genellikle bu ikincil olanaklarla ilave işlevler veya değiştirilmiş davranışlar bekler.

Bazı durumlarda, ikincil işlevleri olmayan kalemler (genellikle kalem ucu ile ilişkili olmayan işlevler), diğer giriş cihaz türleri veya uygulamanızın kullanıcı arabirimindeki bir kullanıcı seçimine bağlı olarak bazı değiştirilmiş davranış türlerini açmanız veya sağlamanız gerekebilir.

Bunu desteklemek için , InkPresenter belirli girişleri işlenmemiş olarak bırakacak şekilde yapılandırılabilir. Bu işlenmemiş giriş daha sonra işlenmek üzere uygulamanıza geçirilir.

Örnek - Vuruş seçimini uygulamak için işlenmemiş veriyi kullanma

Windows Ink Platformu, vuruş seçimi gibi değişiklik yapılmış giriş gerektiren eylemler için yerleşik destek sağlamaz. Bunun gibi özellikleri desteklemek için uygulamalarınızda özel bir çözüm sağlamanız gerekir.

Aşağıdaki kod örneği (tüm kod MainPage.xaml ve MainPage.xaml.cs dosyalarındadır) giriş kalem varil düğmesi (veya sağ fare düğmesi) ile değiştirildiğinde vuruş seçimini etkinleştirme adımlarıdır.

  1. İlk olarak MainPage.xaml dosyasında kullanıcı arabirimini ayarlayacağız.

    Burada, seçim vuruşunu çizmek için InkCanvas'in altına bir tuval ekliyoruz. Seçim vuruşunu çizmek için ayrı bir katman kullanılması, InkCanvas'e ve içeriğine dokunmaz.

    Altında seçim tuvali bulunan boş InkCanvas'ın ekran görüntüsü.

      <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. MainPage.xaml.cs'da, seçim kullanıcı arabiriminin bileşenlerine yönelik referansları tutmak için birkaç global değişken bildiririz. Özellikle seçim kement vuruşu ve seçili vuruşları vurgulayan sınırlayıcı dikdörtgen.

      // Stroke selection tool.
      private Polyline lasso;
      // Stroke selection area.
      private Rect boundingRect;
    
  3. Ardından InkPresenter hem kalemden hem de fareden gelen giriş verilerini mürekkep vuruşları olarak yorumlayarak yapılandıracağız. ve InkCanvas için vuruşları işlemek için kullanılan bazı ilk mürekkep vuruşu özniteliklerini ayarlayın.

    En önemlisi, değiştirilen girişlerin uygulama tarafından işlenmesi gerektiğini belirtmek için InkPresenter'ınInputProcessingConfiguration özelliğini kullanırız. Değiştirilen giriş, InputProcessingConfiguration.RightDragActionInkInputRightDragAction.LeaveUnprocessed değeri atanarak belirtilir. Bu değer ayarlandığında, InkPresenter , işlemek için bir işaretçi olayları kümesi olan InkUnprocessedInput sınıfına geçer.

    InkPresenter tarafından geçirilen işlenmemiş PointerPressed, PointerMoved ve PointerReleased olayları için dinleyiciler atarız. Tüm seçim fonksiyonları bu olayların işleyicilerinde uygulanır.

    Son olarak, InkPresenter'ınStrokeStarted ve StrokesErased olayları için dinleyiciler atarız. Yeni bir vuruş başlatılırsa veya mevcut bir vuruş silinirse seçim kullanıcı arabirimini temizlemek için bu olaylar için işleyicileri kullanırız.

    İnk özelleştirme örneği uygulamasının, varsayılan siyah mürekkep vuruşlarına sahip mürekkep tuvalini gösteren ekran görüntüsü.

      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. Ardından, InkPresenter tarafından geçirilen işlenmemiş PointerPressed, PointerMoved ve PointerReleased olayları için işleyiciler tanımlarız.

    Kement vuruşu ve sınırlayıcı dikdörtgen de dahil olmak üzere tüm seçim işlevleri bu işleyicilerde uygulanır.

    Seçim kementinin ekran görüntüsü.

      // 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. PointerReleased olay işleyicisini sonlandırmak için, tüm içeriğin (kement çizgisi) seçim katmanını temizleriz, ardından kement alanı tarafından kaplanmış mürekkep vuruşlarının etrafına tek bir sınırlayıcı dikdörtgen çizeriz.

    Seçim sınırlama düzeltmesinin ekran görüntüsü.

      // 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. Son olarak StrokeStarted ve StrokesErased InkPresenter olayları için işleyiciler tanımladık.

    İkisi de yeni bir vuruş algılandığında geçerli seçimi temizlemek için aynı temizleme fonksiyonunu çağırır.

      // 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. Yeni bir vuruş başlatıldığında veya mevcut bir vuruş silindiğinde, seçim tuvalinden tüm seçim arayüzünü kaldıran işlev aşağıdadır.

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

Özel mürekkep render'ı

Mürekkep girişi, varsayılan olarak düşük gecikmeli bir arka plan iş parçacığında işlenir ve çizilirken, yani "ıslak" olarak, işlem sırasında görüntülenir. Vuruş tamamlandığında (kalem veya parmak kaldırıldığında ya da fare düğmesi serbest bırakıldığında), vuruş kullanıcı arabirimi iş parçacığında işlenir ve "kuru" olarak InkCanvas katmanına işlenir. Bu katman, uygulama içeriğinin üstünde bulunur ve ıslak mürekkebin yerine geçer.

Bu varsayılan davranışı geçersiz kılabilir ve ıslak mürekkep vuruşlarını "özel kurutma" yoluyla mürekkep deneyimini tamamen kontrol edebilirsiniz. Varsayılan davranış genellikle çoğu uygulama için yeterli olsa da, özel kurutmanın gerekebileceği birkaç durum vardır, bunlar şunlardır:

  • Büyük veya karmaşık mürekkep vuruşları koleksiyonlarının daha verimli yönetimi
  • Büyük mürekkep tuvallerinde daha verimli kaydırma ve yakınlaştırma desteği
  • Z düzenini korurken mürekkep ve şekiller veya metin gibi diğer nesneler arasında geçiş yapma
  • Mürekkebi senkronize bir şekilde DirectX şekline kurutmak ve dönüştürmek (örneğin, düz bir çizgi veya şeklin, ayrı bir InkCanvas katmanı yerine uygulama içeriğine rasterleştirilip bütünleştirilmesi).

Özel kurutma işlemi, varsayılan InkCanvas denetimi yerine, mürekkep girişini yönetmek ve Evrensel Windows uygulamanızın Direct2D cihaz bağlamına çizmek için bir IInkD2DRenderer nesnesi gerektirir.

ActivateCustomDrying (InkCanvas yüklenmeden önce) çağrısı yaparak, uygulama bir InkSynchronizer nesnesi oluşturur ve bu nesneyi bir mürekkep vuruşunun SurfaceImageSource veya VirtualSurfaceImageSource üzerinde nasıl kurutulmuş olarak gösterileceğini özelleştirmek için kullanılır.

Hem SurfaceImageSource hem de VirtualSurfaceImageSource, uygulamanızın içeriğine çizim yapıp kompozisyon oluşturabileceğiniz bir DirectX paylaşımlı yüzey sağlar. Bununla birlikte, VSIS, yüksek performanslı kaydırma ve yakınlaştırma işlemleri için ekrandan daha büyük bir sanal yüzey sağlayarak avantaj sunar. Bu yüzeylerde yapılan görsel güncelleştirmeler XAML UI iş parçacığıyla eşitlendiğinden, mürekkep her iki yüzeye de işlendiğinde, ıslak mürekkep InkCanvas'tan eşzamanlı olarak kaldırılabilir.

Bir SwapChainPanel'e özel kuru mürekkep uygulaması da yapabilirsiniz, ancak UI iş parçacığı ile senkronizasyon garanti edilmez ve mürekkep SwapChainPanel'inize işlendiğinde ve InkCanvas'tan kaldırıldığında zaman arasında bir gecikme olabilir.

Bu işlevin tam örneği için bkz. Complex mürekkep örneği.

Uyarı

Özel kurutma ve InkToolbar
Uygulamanız özel bir kurutma uygulamasıyla InkPresenter varsayılan mürekkep işleme davranışını geçersiz kılarsa, işlenen mürekkep vuruşları artık InkToolbar'da kullanılamaz ve InkToolbar'ın yerleşik silme komutları beklendiği gibi çalışmaz. Silme işlevselliği sağlamak için tüm işaretçi olaylarını işlemeniz, her vuruşta isabet testi gerçekleştirmeniz ve yerleşik "Tüm mürekkebleri sil" komutunu geçersiz kılmanız gerekir.

Başlık Açıklama
Mürekkep vuruşlarını tanıma Mürekkep vuruşlarını, el yazısı tanıma kullanarak metne, veya özel tanıma sistemi kullanarak şekillere dönüştürün.
Mürekkep vuruşlarını depola ve geri al Mürekkep vuruşu verilerini, gömülü Mürekkep Serileştirilmiş Biçim (ISF) meta verilerini kullanarak Grafik Değişim Biçimi (GIF) dosyasında depolayın.
Windows mürekkep oluşturma uygulamasına InkToolbar ekleme Windows uygulama mürekkep oluşturma uygulamasına varsayılan bir InkToolbar ekleyin, InkToolbar'a özel kalem düğmesi ekleyin ve özel kalem düğmesini özel kalem tanımına bağlayın.

API’ler

Örnekleri

Arşiv Örnekleri