ما هو وسيلة جيدة لأداء اختبار ضرب على formattedtext؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

أجد نصا باستخدام FormattedText, ، ولكن يبدو أن هناك بأي حال من الأحوال لإجراء اختبار لكل سحر الناتج عن الإخراج المقدم. إنه قرئي فقط، لذلك أنا أساسا بحاجة فقط إلى الاختيار، لا التحرير.

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

لقد نظرت في GlyphRun, ، يبدو أنني يمكن أن أشعر بالضرب من ذلك أو فئة ذات صلة، لكنني سأؤدي إلى إعادة استخدام الكثير من الوظائف، ويبدو أنه يجب أن يكون هناك طريقة أبسط ...

هل يعرف أحد وسيلة جيدة لتنفيذ هذا؟

هل كانت مفيدة؟

المحلول

أفضل طريقة هي تصميم هيكل بيانات جيد لتخزين النص الخاص بك والتي تعتبر أيضا الاختبار. يمكن أن يكون أحد الأمثلة على تقسيم النص إلى كتل (كلمات أو خطوط أو فقرات اعتمادا على ما تحتاجه). ثم يجب أن يكون لكل كتلة من هذا القبيل مربع محيط يجب إعادة حسابه في أي عمليات تنسيق. أيضا النظر في مواقع caret في التصميم الخاص بك.

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

نصائح أخرى

يمكنك الحصول على هندسة كل حرف من كائن formattedText واستخدام حدود كل حرف للقيام باختبار ضرب الخاص بك.

var geometry = (GeometryGroup)((GeometryGroup)text.BuildGeometry(new Point(0, 0))).Children[0];
foreach (var c in geometry.Children)
{
  if (c.Bounds.Contains(point))
    return index;
  index++;
}

في OnRender، يمكنك تقديم كائنات الهندسة هذه بدلا من النص المنسق.

توافق تماما مع SESH - أسهل طريقة ستهرب من عدم تنفيذ تحميل كامل من وظيفة FormattEtext ستكون من خلال تقسيم العناصر الفردية التي تريد الضغط عليها في عناصر التحكم الخاصة بها / الطيران.

فكر في استخدام TextBlock وإضافة كل كلمة لأنها مضمنة (أو)، ثم ربط خاصية Inline's ISMousedirectellyover، لدينا مندوبين لدينا إلى أحداث Mouseenter & Mouseleave.

إذا كنت ترغب في القيام باختبار ضرب مستوى البكسل للرسومات الفعلي (أي هو الفأرة بالضبط في نقطة هذا "I ')، فستحتاج إلى استخدام Glyphruns والقيام باختبار الضرب اليدوي على الحروف الرسومية (قراءة: الشغل).

أنا متأخر جدا على الحزب - إذا لم ينته الحزب، ولن تحتاج إلى هندسة الأحرف الفعلية، فقد وجدت شيئا مثل هذا مفيد:

 for (int i = 0; i < FormattedText.Text.Length; i++)
 {
            characterHighlightGeometry = FormattedText.BuildHighlightGeometry(new Point(), i, 1);
            CharacterHighlightGeometries.Children.Add(characterHighlightGeometry);
 }

يتضمن BuildGeometry () فقط هندسة المسار الفعلي للشخصية. يقوم Buildhighlightgeometry () بإنشاء الحدود الخارجية لجميع الأحرف - بما في ذلك المسافات، لذلك يمكن تحديد موقع فهرس على مساحة من قبل:

 foreach (var c in CharacterHighlightGeometries.Children)
        {
            if (c.Bounds.Contains(centerpoint))
            {
                q = c;
                cpos = index;
                break;
            }
            index++;
        }

أتمنى أن يساعدك هذا.

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