سؤال

هل هناك طريقة سهلة (في .Net) لاختبار ما إذا كان الخط مثبتًا على الجهاز الحالي؟

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

المحلول

string fontName = "Consolas";
float fontSize = 12;

using (Font fontTester = new Font( 
       fontName, 
       fontSize, 
       FontStyle.Regular, 
       GraphicsUnit.Pixel)) 
{
    if (fontTester.Name == fontName)
    {
        // Font exists
    }
    else
    {
        // Font doesn't exist
    }
}

نصائح أخرى

كيف يمكنك الحصول على قائمة بجميع الخطوط المثبتة؟

var fontsCollection = new InstalledFontCollection();
foreach (var fontFamiliy in fontsCollection.Families)
{
    if (fontFamiliy.Name == fontName) ... \\ installed
}

يرى فئة InstalledFontCollection للتفاصيل.

شبكة MSDN:
تعداد الخطوط المثبتة

بفضل جيف، من الأفضل أن أقرأ وثائق فئة الخط:

إذا حددت المعلمة FamilyName خطًا غير مثبت على الجهاز الذي يعمل على تشغيل التطبيق أو غير مدعوم ، فسيتم استبدال Microsoft Sans Serif.

نتيجة هذا العلم:

    private bool IsFontInstalled(string fontName) {
        using (var testFont = new Font(fontName, 8)) {
            return 0 == string.Compare(
              fontName,
              testFont.Name,
              StringComparison.InvariantCultureIgnoreCase);
        }
    }

الإجابات الأخرى المقترحة باستخدام Font الخلق لا يعمل إلا إذا كان FontStyle.Regular متاح.بعض الخطوط، على سبيل المثال Verlag Bold، ليس لها نمط عادي.سوف يفشل الخلق مع استثناء الخط "Verlag Bold" لا يدعم النمط "العادي".ستحتاج إلى التحقق من الأنماط التي سيتطلبها تطبيقك.الحل كالتالي:

  public static bool IsFontInstalled(string fontName)
  {
     bool installed = IsFontInstalled(fontName, FontStyle.Regular);
     if (!installed) { installed = IsFontInstalled(fontName, FontStyle.Bold); }
     if (!installed) { installed = IsFontInstalled(fontName, FontStyle.Italic); }

     return installed;
  }

  public static bool IsFontInstalled(string fontName, FontStyle style)
  {
     bool installed = false;
     const float emSize = 8.0f;

     try
     {
        using (var testFont = new Font(fontName, emSize, style))
        {
           installed = (0 == string.Compare(fontName, testFont.Name, StringComparison.InvariantCultureIgnoreCase));
        }
     }
     catch
     {
     }

     return installed;
  }

الخروج من إجابة GvS:

    private static bool IsFontInstalled(string fontName)
    {
        using (var testFont = new Font(fontName, 8))
            return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
    }

وإليك كيف سأفعل ذلك:

private static bool IsFontInstalled(string name)
{
    using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
    {
        return fontsCollection.Families
            .Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
    }
}

شيء واحد يجب ملاحظته مع هذا هو أن Name الخاصية ليست دائمًا ما تتوقعه من البحث في C:\WINDOWS\Fonts.على سبيل المثال، لدي خط مثبت يسمى "Arabic Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular") سيعود كاذبة، ولكن IsFontInstalled("Arabic Typesetting") سوف يعود صحيحا.("التنضيد العربي" هو اسم الخط في أداة معاينة الخطوط في Windows.)

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

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