سؤال

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

وكيف يمكنني الحصول على المربع المحيط من سلسلة بالنظر إلى الخط دون استخدام الطبقة Graphics؟ لماذا تحتاج حتى كائن Graphics عندما بلدي الخط بالبكسل؟

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

المحلول

إذا كان لديك إشارة إلى System.Windows.Forms، حاول استخدام فئة TextRenderer. وهناك أسلوب ثابت (MeasureText) والتي تأخذ سلسلة والخط وإرجاع الحجم. MSDN رابط

نصائح أخرى

وأنت لا تحتاج إلى استخدام الرسومات الكائن الذي تستخدمه لتقديم للقيام القياس. هل يمكن إنشاء فئة فائدة ثابتة:

public static class GraphicsHelper
{
    public static SizeF MeasureString(string s, Font font)
    {
        SizeF result;
        using (var image = new Bitmap(1, 1))
        {
            using (var g = Graphics.FromImage(image))
            {
                result = g.MeasureString(s, font);
            }
        }

        return result;
    }
}

قد يكون worthwile، تبعا للموقف لتعيين نقطة في البوصة من الصورة النقطية كذلك.

وطريقة MeasureString فيNerdFury الجواب سيعطي عرض سلسلة أعلى من معلومات expected.Additional يمكنك العثور على <لأ href = "https://stackoverflow.com/questions/1203087/why-is-graphics-measurestring-returning- على بعد أعلى من المتوقع، عدد "> هنا . إذا كنت تريد فقط قياس طول البدني يرجى إضافة هذا خطين:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
result = 
  g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);

وهذا المثال لا عملا عظيما لتوضيح استخدام FormattedText. يوفر FormattedText السيطرة على مستوى منخفض لرسم النص في نوافذ العرض مؤسسة (WPF) التطبيقات. يمكنك استخدامه لقياس العرض من سلسلة مع خط معين دون استخدام الكائن الرسومات.

public static float Measure(string text, string fontFamily, float emSize)
{
    FormattedText formatted = new FormattedText(
        item, 
        CultureInfo.CurrentCulture, 
        System.Windows.FlowDirection.LeftToRight, 
        new Typeface(fontFamily), 
        emSize, 
        Brushes.Black);

    return formatted.Width;
}

وتشمل المكتبات WindowsBase وPresentationCore.

وهذا قد لا يكون ولكن تكرار الآخرين، ولكن مشكلتي الرسومات غير المرغوب فيها الكائن أيضا. وبعد الاستماع إلى الإحباط أعلاه أنا ببساطة حاولت:

Size proposedSize = new Size(int.MaxValue, int.MaxValue);
TextFormatFlags flags = TextFormatFlags.NoPadding;
Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags);

و(حيث "المحتوى" عبارة عن سلسلة لقياس وcardfont على الخط هو في)

... وكان في الحظ. أنا يمكن استخدام النتيجة لضبط عرض العمود بلدي في VSTO.

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