سؤال

في كل مرة أقوم فيها بإنشاء نموذج جديد في التطبيق الخاص بي، فإنه يستخدم الخط "Microsoft Sans Serif, 8.25pt" بشكل افتراضي.أنا لا أغيره لأنني أعرف أن النموذج الخاص بي في هذه الحالة يجب اختر الخط الافتراضي للنظام.ومع ذلك، عندما أقوم بتشغيل التطبيق الخاص بي، فإن الخط المستخدم لا يزال أي شيء سوى Segoe UI (خط النظام الافتراضي في نظام التشغيل Windows Vista الخاص بي).

لماذا يحدث هذا؟كيف أتأكد من أن تطبيقي يبدو كتطبيق Windows عادي؟

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

المحلول

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

نصائح أخرى

الإجابة المقبولة لا تجيب حقًا على السؤال؛إنه يفسر فقط سبب حدوث هذا السلوك.

تقترح بعض الإجابات الأخرى حلولاً قوية، لكنني وجدت أن الحل الأفضل حقًا هو إنشاء نموذج أساسي ترث منه جميع النماذج الموجودة في تطبيقك وتعيين خاصية الخط لهذا النموذج الأساسي على SystemFonts.MessageBoxFont في المنشئ.وهذا لا يضمن فقط أن تطبيقك يلتقط الخط الصحيح في وقت التشغيل، استنادًا إلى بيئة المستخدم (لتجنب المشكلة المحتملة التي يطرحها Hans Passant - سيلجأ نظام XP الذي لا يحتوي على Office 2007 إلى Microsoft Sans Serif في غياب Segoe UI )، ولكنه يمنحك أيضًا وقت التصميم دعم لخط Windows الحالي الخاص بك.يؤدي استخدام الخط الصحيح في وقت التصميم إلى حل المشكلة التي يشير إليها Josuegomes، لأن أي عنصر تحكم في الحاوية يتم إنشاؤه في النموذج سوف يلتقط الخط الذي يستخدمه النموذج في وقت التصميم.

إلى جانب المزايا المذكورة أعلاه، يحررك هذا من الاضطرار إلى تذكر تعديل المنشئ لكل نموذج تقوم بإنشائه ويضمن الاتساق عبر جميع النماذج في تطبيقك، بالإضافة إلى إعطائك مكانًا لوضع وظائف مشتركة أخرى.أستخدم هذا بعدة طرق مختلفة مثل p/invocing وما إلى ذلك.لإصلاح الأخطاء في تنفيذ WinForms.

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

myControl.Font = New Font(Me.Font, FontStyle.Bold)

ويمكنك إضافة قبل InitializeComponent () في منشئ نموذج (ق):

this.Font = SystemFonts.MessageBoxFont;

وهذا يبدو للعمل مع Windows XP و Windows Vista.

نعم، فإنه يستخدم الخط إرجاعها بواسطة GetStockObject(DEFAULT_GUI_FONT). وهو MS بلا الرقيق. خط القديم، انتهت منذ فترة طويلة من معظم الآلات. مخطط الخط ترجمتها إلى، لم يكن مفاجئا، ومايكروسوفت بلا الرقيق.

وليس هناك إجراءات موثقة أعرف لتغيير هذا الخط الافتراضي، مستندات SDK تذكر MS بلا الرقيق صراحة. إذا كنت تريد Segoe، عليك أن تسأل عن ذلك. التي ليست آمنة القيام به، لا يزال هناك الكثير من آلات XP هناك دون أوفيس 2007. وسيكون مخطط الخط ترجمتها على جهاز ليس لديها Segoe المتاحة. غير متأكد ما دفعها للخروج، وأنا لم يكن لديك مثل هذا الجهاز غادر بعد الآن.

وتحديد خاصية خط النموذج إلى SystemFonts.DialogFont لا يعمل إذا كان لديك صناديق جماعية مع الضوابط المرتبطة بها. التحكم داخل منطقة الجزاء مجموعة لا تتأثر خاصية خط للنموذج. I "حلها" هذا عن طريق تعيين خاصية الخط إلى SystemFonts.DialogFont عن كل مربع مجموعة.

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

        foreach (Control ctr in this.Controls)
        {
            ctr.Font = SystemFonts.IconTitleFont;

            // controls in groupboxes are not child of main form
            if (ctr.HasChildren)
            {
                foreach (Control childControl in ctr.Controls)
                {
                    childControl.Font = SystemFonts.IconTitleFont;
                }
            }        
        }

وجرب هذا، انقر فوق نموذج وتغيير حجم الخط على سبيل المثال لقد غيرت حجم الخط من نموذج إلى 12pt ثم اختبار مربع النص السحب التي كتبها إلى النموذج. سترى، يتم تغيير حجم النص إلى 12pt كذلك. لقد حصلت للتو هذا الحل عن طريق الصدفة.

ووControl.DefaultFont للقراءة فقط. كان hacky واحد للكتابة هو استخدام التفكير.

Type settingsType = typeof(Control);
var defaultFontField = settingsType.GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic);
defaultFontField.SetValue(null, new Font("Segoe UI", 8.25F));

ومما لا شك فيه أن يكون UT ابقاء العين على هذا الرمز، لم يكن هناك عقد API لحمايتك إذا كانت التغييرات تنفيذ الإطار.

وكما أن ندرك مصمم الأشكال التي في معظم الوقت سوف تضاف الخط الحرفي في صفوف .designer.

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