Mürekkep Girişi Denetimi Oluşturma
Mürekkepleri dinamik ve statik olarak işleyen özel bir denetim oluşturabilirsiniz. Yani, bir kullanıcı bir çizgi çizerken mürekkebi işlemekte ve bu, mürekkebin tablet kaleminden "akıyor" gibi görünmesine neden olmaktadır; tablet kalemi, Panodan yapıştırma veya bir dosyadan yükleme yoluyla denetime eklendikten sonra da mürekkep görüntülenir. Mürekkebi dinamik olarak görüntülemek için denetiminizin bir DynamicRendererkullanması gerekir. Mürekkebi statik olarak çizdirmek için, ekran kalemi olay yöntemlerini (OnStylusDown, OnStylusMoveve OnStylusUp) geçersiz kılarak StylusPoint verilerini toplamanız, vuruşlar oluşturmanız ve bunları mürekkebi denetimi üzerine çizdirmek için bir InkPresenter'e eklemeniz gerekir.
Bu konu aşağıdaki alt bölümler içerir:
Nasıl yapılır: Ekran Kalemi Noktası Verilerini Toplama ve Mürekkep Vuruşları Oluşturma
Nasıl Yapılır: Kontrolünüzü Fare Girişini Kabul Edecek Şekilde Etkinleştirme
Nasıl yapılır: Ekran Kalemi Noktası Verilerini Toplama ve Mürekkep Vuruşları Oluşturma
Mürekkep izlerini toplamak ve yönetmek için bir denetim oluşturmak üzere şunları yapın:
Control veya Controltüretilen sınıflardan birinden türetilen Labelgibi bir sınıf elde edin.
using System; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Input.StylusPlugIns; using System.Windows.Controls; using System.Windows;
class InkControl : Label {
}
sınıfına bir InkPresenter ekleyin ve Content özelliğini yeni InkPresenterolarak ayarlayın.
InkPresenter ip; public InkControl() { // Add an InkPresenter for drawing. ip = new InkPresenter(); this.Content = ip; }
AttachVisuals yöntemini çağırarak RootVisual'ı DynamicRenderer'e InkPresenter'ye iliştirin ve DynamicRenderer'ü StylusPlugIns koleksiyonuna ekleyin. Bu, InkPresenter'ın, kalem ucu verileri kontrolünüz altında toplanırken mürekkebi görüntülemesini sağlar.
public InkControl() {
// Add a dynamic renderer that // draws ink as it "flows" from the stylus. dr = new DynamicRenderer(); ip.AttachVisuals(dr.RootVisual, dr.DrawingAttributes); this.StylusPlugIns.Add(dr); }
OnStylusDown yöntemini geçersiz kılın. Bu yöntemde, Captureçağrısıyla ekran kalemini ele geçirin. Ekran kalemini kontrol kapsamına alarak, ekran kalemi kontrolün sınırlarını terk etse bile denetiminiz StylusMove ve StylusUp olaylarını almaya devam eder. Bu kesinlikle zorunlu değildir, ancak iyi bir kullanıcı deneyimi için neredeyse her zaman istenir. StylusPoint veri toplamak için yeni bir StylusPointCollection oluşturun. Son olarak, StylusPointCollection'e ilk veri kümesi StylusPoint'ı ekleyin.
protected override void OnStylusDown(StylusDownEventArgs e) { // Capture the stylus so all stylus input is routed to this control. Stylus.Capture(this); // Allocate memory for the StylusPointsCollection and // add the StylusPoints that have come in so far. stylusPoints = new StylusPointCollection(); StylusPointCollection eventPoints = e.GetStylusPoints(this, stylusPoints.Description); stylusPoints.Add(eventPoints); }
OnStylusMove yöntemini geçersiz kılın ve StylusPoint verilerini daha önce oluşturduğunuz StylusPointCollection nesnesine ekleyin.
protected override void OnStylusMove(StylusEventArgs e) { if (stylusPoints == null) { return; } // Add the StylusPoints that have come in since the // last call to OnStylusMove. StylusPointCollection newStylusPoints = e.GetStylusPoints(this, stylusPoints.Description); stylusPoints.Add(newStylusPoints); }
OnStylusUp yöntemini geçersiz kılın ve StylusPointCollection verileriyle yeni bir Stroke oluşturun. Oluşturduğunuz yeni Stroke'ı InkPresenter'nin Strokes koleksiyonuna ekleyin ve ekran kalemi yakalamayı serbest bırakın.
protected override void OnStylusUp(StylusEventArgs e) { if (stylusPoints == null) { return; } // Add the StylusPoints that have come in since the // last call to OnStylusMove. StylusPointCollection newStylusPoints = e.GetStylusPoints(this, stylusPoints.Description); stylusPoints.Add(newStylusPoints); // Create a new stroke from all the StylusPoints since OnStylusDown. Stroke stroke = new Stroke(stylusPoints); // Add the new stroke to the Strokes collection of the InkPresenter. ip.Strokes.Add(stroke); // Clear the StylusPointsCollection. stylusPoints = null; // Release stylus capture. Stylus.Capture(null); }
Nasıl yapılır: Fareden Girişi Kabul Etmek için Denetiminizi Etkinleştirme
Önceki denetimi uygulamanıza ekler, çalıştırır ve fareyi giriş cihazı olarak kullanırsanız vuruşların kalıcı olmadığını fark edeceksiniz. Fare giriş cihazı olarak kullanıldığında vuruşları kalıcı hale getirmek için aşağıdakileri yapın:
OnMouseLeftButtonDown geçersiz kılın ve yeni bir StylusPointCollection oluşturun Olay gerçekleştiğinde farenin konumunu alın ve nokta verilerini kullanarak bir StylusPoint oluşturun ve StylusPointStylusPointCollectionekleyin.
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); // If a stylus generated this event, return. if (e.StylusDevice != null) { return; } // Start collecting the points. stylusPoints = new StylusPointCollection(); Point pt = e.GetPosition(this); stylusPoints.Add(new StylusPoint(pt.X, pt.Y)); }
OnMouseMove yöntemini geçersiz kılın. Olay gerçekleştiğinde farenin konumunu alın ve nokta verilerini kullanarak bir StylusPoint oluşturun. daha önce oluşturduğunuz StylusPointCollection nesnesine StylusPoint ekleyin.
protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); // If a stylus generated this event, return. if (e.StylusDevice != null) { return; } // Don't collect points unless the left mouse button // is down. if (e.LeftButton == MouseButtonState.Released || stylusPoints == null) { return; } Point pt = e.GetPosition(this); stylusPoints.Add(new StylusPoint(pt.X, pt.Y)); }
OnMouseLeftButtonUp yöntemini geçersiz kılın. StylusPointCollection verileriyle yeni bir Stroke oluşturun ve oluşturduğunuz Stroke'yi yeni InkPresenter'nin Strokes koleksiyonuna ekleyin.
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) { base.OnMouseLeftButtonUp(e); // If a stylus generated this event, return. if (e.StylusDevice != null) { return; } if (stylusPoints == null) { return; } Point pt = e.GetPosition(this); stylusPoints.Add(new StylusPoint(pt.X, pt.Y)); // Create a stroke and add it to the InkPresenter. Stroke stroke = new Stroke(stylusPoints); stroke.DrawingAttributes = dr.DrawingAttributes; ip.Strokes.Add(stroke); stylusPoints = null; }
Bir araya getirmek
Aşağıdaki örnek, kullanıcı fareyi veya kalemi kullandığında mürekkep toplayan özel bir denetimdir.
using System;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Input.StylusPlugIns;
using System.Windows.Controls;
using System.Windows;
// A control for managing ink input
class InkControl : Label
{
InkPresenter ip;
DynamicRenderer dr;
// The StylusPointsCollection that gathers points
// before Stroke from is created.
StylusPointCollection stylusPoints = null;
public InkControl()
{
// Add an InkPresenter for drawing.
ip = new InkPresenter();
this.Content = ip;
// Add a dynamic renderer that
// draws ink as it "flows" from the stylus.
dr = new DynamicRenderer();
ip.AttachVisuals(dr.RootVisual, dr.DrawingAttributes);
this.StylusPlugIns.Add(dr);
}
static InkControl()
{
// Allow ink to be drawn only within the bounds of the control.
Type owner = typeof(InkControl);
ClipToBoundsProperty.OverrideMetadata(owner,
new FrameworkPropertyMetadata(true));
}
protected override void OnStylusDown(StylusDownEventArgs e)
{
// Capture the stylus so all stylus input is routed to this control.
Stylus.Capture(this);
// Allocate memory for the StylusPointsCollection and
// add the StylusPoints that have come in so far.
stylusPoints = new StylusPointCollection();
StylusPointCollection eventPoints =
e.GetStylusPoints(this, stylusPoints.Description);
stylusPoints.Add(eventPoints);
}
protected override void OnStylusMove(StylusEventArgs e)
{
if (stylusPoints == null)
{
return;
}
// Add the StylusPoints that have come in since the
// last call to OnStylusMove.
StylusPointCollection newStylusPoints =
e.GetStylusPoints(this, stylusPoints.Description);
stylusPoints.Add(newStylusPoints);
}
protected override void OnStylusUp(StylusEventArgs e)
{
if (stylusPoints == null)
{
return;
}
// Add the StylusPoints that have come in since the
// last call to OnStylusMove.
StylusPointCollection newStylusPoints =
e.GetStylusPoints(this, stylusPoints.Description);
stylusPoints.Add(newStylusPoints);
// Create a new stroke from all the StylusPoints since OnStylusDown.
Stroke stroke = new Stroke(stylusPoints);
// Add the new stroke to the Strokes collection of the InkPresenter.
ip.Strokes.Add(stroke);
// Clear the StylusPointsCollection.
stylusPoints = null;
// Release stylus capture.
Stylus.Capture(null);
}
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
// If a stylus generated this event, return.
if (e.StylusDevice != null)
{
return;
}
// Start collecting the points.
stylusPoints = new StylusPointCollection();
Point pt = e.GetPosition(this);
stylusPoints.Add(new StylusPoint(pt.X, pt.Y));
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
// If a stylus generated this event, return.
if (e.StylusDevice != null)
{
return;
}
// Don't collect points unless the left mouse button
// is down.
if (e.LeftButton == MouseButtonState.Released ||
stylusPoints == null)
{
return;
}
Point pt = e.GetPosition(this);
stylusPoints.Add(new StylusPoint(pt.X, pt.Y));
}
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonUp(e);
// If a stylus generated this event, return.
if (e.StylusDevice != null)
{
return;
}
if (stylusPoints == null)
{
return;
}
Point pt = e.GetPosition(this);
stylusPoints.Add(new StylusPoint(pt.X, pt.Y));
// Create a stroke and add it to the InkPresenter.
Stroke stroke = new Stroke(stylusPoints);
stroke.DrawingAttributes = dr.DrawingAttributes;
ip.Strokes.Add(stroke);
stylusPoints = null;
}
}
Eklentiler ve Dinamik Renderleyiciler Kullanma
InkCanvas gibi özel denetiminizde de özel StylusPlugIn ve ek DynamicRenderer nesneleri olabilir. Bunları StylusPlugIns koleksiyonuna ekleyin.
StylusPlugInCollection içindeki StylusPlugIn nesnelerinin sırası, gösterildiğinde mürekkebin görünümünü etkiler.
dynamicRenderer
adlı bir DynamicRenderer olduğunu ve tablet kaleminin mürekkep konumunu ayarlamak için kullanılan translatePlugin
adlı özel bir StylusPlugIn olduğunu varsayalım. Eğer translatePlugin
, StylusPlugInCollection'deki ilk StylusPlugIn ise ve dynamicRenderer
ikinciyse, kullanıcı kalemi hareket ettirirken "akan" mürekkep yer değiştirecektir.
dynamicRenderer
ilk ve translatePlugin
ikinci ise, kullanıcı kalemi kaldırana kadar mürekkep kaydırılmaz.
Sonuç
Ekran kalemi olay yöntemlerini geçersiz kılarak mürekkep girdilerini toplayan ve görüntüleyen bir denetim oluşturabilirsiniz. Kendi denetiminizi oluşturarak, kendi StylusPlugIn sınıflarınızı türeterek ve onları StylusPlugInCollection'e ekleyerek, dijital mürekkeple neredeyse hayal edilebilecek her türlü davranışı uygulayabilirsiniz. StylusPoint verilerine, oluşturulduğunda erişebilirsiniz, böylece Stylus girişini özelleştirmenize ve uygulamanıza uygun şekilde ekranda işlem fırsatına sahip olursunuz. StylusPoint verilerine bu kadar düşük düzeyde erişiminiz olduğundan, mürekkep koleksiyonunu uygulayabilir ve uygulamanız için en iyi performansla işleyebilirsiniz.
Ayrıca bkz.
- gelişmiş mürekkep işleme
- Kalem Girişi Erişim Sağlama ve Düzenleme
.NET Desktop feedback