مخصص InkCanvas (MSDN نموذج التعليمات البرمجية لا يعمل بشكل صحيح)

StackOverflow https://stackoverflow.com/questions/1422503

  •  07-07-2019
  •  | 
  •  

سؤال

أريد أن استخدام الفرش المخصصة مع InkCanvas.

هو رمز مقتطف من MSDN.(http://msdn.microsoft.com/en-us/library/ms747347.aspx)

إذا كنت تستخدم هذا الرمز و تحريك الماوس سريع جدا أحصل على مساحة بين الفرش(الحذف):Screenshot

و سؤالي هو بالطبع كيفية إصلاح هذا ولكن أنا أيضا من الغريب لماذا يحدث هذا (أريد أن أتعلم من ذلك) ربما اعتقدت أنني فعلت شيئا خاطئا ولكن حتى لو قص/لصق المثال يحدث.

شيء واحد قليلا لاحظت عند قراءة رمز كان هذا التعليق في CustomStroke الدرجة

// Draw linear gradient ellipses between
// all the StylusPoints in the Stroke

يبدو لي أن رسم الحذف بين النقاط ليس فقط في النقاط.

أنا باستخدام C#.NET.

مرة أخرى باختصار:

  • لماذا يحدث هذا
  • ساعدني على إصلاح ذلك :)
هل كانت مفيدة؟

المحلول

لماذا يحدث هذا

يرسم InkCanvas المخصص في المثال شكلًا بيضاويًا عند كل نقطة StrokePoint مجمعة، لكنه لا يحاول رسم خطوط بينهما.يتم تنفيذ التحكم القياسي في InkCanvas عن طريق رسم خطوط بين النقاط المعطاة له.هذا هو السبب في أن تطبيق InkCanvas المخصص من المثال يترك فجوات بينما لا يترك التطبيق المدمج ذلك.

كيف تصلحها

يمكن توسيع الكود المخصص بسهولة حتى لا يترك فجوات:بالإضافة إلى رسم القطع الناقص عند كل نقطة، يمكنه رسم خطوط بين كل زوج من النقاط.

يمكن إضافة التعليمات البرمجية لرسم خطوط الاتصال قبل التعليمات البرمجية لرسم علامات الحذف، مثل هذا:

// Draw connecting lines
var geo = new StreamGeometry();
using(geoContext = geo.Open())
{
  geoContext.StartFigure(stylusPoints[0], false, false);
  geoContext.PolyLineTo(stylusPoints.Skip(1).Cast<Point>(), true, false);
}
drawingContext.DrawGeometry(null, connectingLinePen, geo);

// Draw ellipses
for(int i = 1; i < stylusPoints.Count; i++)
{
  ... etc ...

يعمل هذا الرمز عن طريق إنشاء StreamGeometry متعدد الخطوط ثم رسمه إلى السياق.يعد استخدام StreamGeometry في هذا السياق أكثر كفاءة بشكل عام من إنشاء PathGeometry باستخدام Polyline أو إجراء مجموعة من استدعاءات DrawLine مباشرة على drawCanvas.

ملحوظة:إن استخدام جهاز تحويل رقمي أفضل لن يحل المشكلة الأساسية، وهي أن InkCanvas المخصص مصمم فعليًا لعرض البيانات فقط في النقاط التي تم أخذ عينات منها وليس بينهما.

نصائح أخرى

لماذا يحدث هذا:يحتوي عنصر التحكم WPF InkCanvas على عدد محدود من المدخلات في الثانية عند استخدام الماوس؛مما يعني أن مدخلات القلم الخاص بك ستكون لها مسافات أكبر وأكبر فيما بينها أثناء تحريك الماوس بشكل أسرع وأسرع.يبدو أن العينة نفسها ترسم علامات القطع عند كل نقطة إدخال للقلم، وليس بين النقاط.

كيفية حل هذا:استخدم جهاز كمبيوتر لوحي - يحتوي جهاز التحويل الرقمي مثل الكمبيوتر اللوحي على عدد أكبر بكثير من المدخلات في الثانية، لذا يكون من الصعب مواجهته أو ملء الفراغات - يتم التقدير بشكل أساسي بناءً على النقاط السابقة، وربما منحنى بيزييه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top