.net - sintomas - Prueba si una fuente está instalada
fuente no enciende (6)
¿Hay una manera fácil (en .Net) de probar si hay una fuente instalada en la máquina actual?
Saliendo de la respuesta de GvS:
private static bool IsFontInstalled(string fontName)
{
using (var testFont = new Font(fontName, 8))
return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
}
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
}
}
Otras respuestas propuestas con Creación de Font
solo funcionan si FontStyle.Regular
está disponible. Algunas fuentes, por ejemplo, Verlag Bold, no tienen un estilo regular. La creación fallaría con la excepción. La fuente ''Verlag Bold'' no es compatible con el estilo ''Regular'' . Deberá verificar los estilos que su aplicación requerirá. Una solución sigue:
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;
}
Gracias a Jeff, será mejor que lea la documentación de la clase Font:
Si el parámetro familyName especifica una fuente que no está instalada en la máquina que ejecuta la aplicación o no es compatible, se sustituirá a Microsoft Sans Serif.
El resultado de este conocimiento:
private bool IsFontInstalled(string fontName) {
using (var testFont = new Font(fontName, 8)) {
return 0 == string.Compare(
fontName,
testFont.Name,
StringComparison.InvariantCultureIgnoreCase);
}
}
Así es como lo haría:
private static bool IsFontInstalled(string name)
{
using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
{
return fontsCollection.Families
.Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
}
}
Una cosa a tener en cuenta con esto es que la propiedad Name
no siempre es lo que esperaría al buscar en C: / WINDOWS / Fonts. Por ejemplo, tengo una fuente instalada llamada "Arabic Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular")
devolverá false, pero IsFontInstalled("Arabic Typesetting")
devolverá true. ("Tipografía árabe" es el nombre de la fuente en la herramienta de vista previa de fuentes de Windows).
En cuanto a los recursos, realicé una prueba en la que llamé a este método varias veces, y la prueba finalizó en solo unos pocos milisegundos cada vez. Mi máquina está un poco sobrecargada, pero a menos que necesites ejecutar esta consulta con mucha frecuencia, parece que el rendimiento es muy bueno (e incluso si lo hiciste, para eso sirve el almacenamiento en caché).
¿Cómo se obtiene una lista de todas las fuentes instaladas?
var fontsCollection = new InstalledFontCollection();
foreach (var fontFamiliy in fontsCollection.Families)
{
if (fontFamiliy.Name == fontName) ... // installed
}
Ver la clase InstalledFontCollection para más detalles.