Microsoft MVP

Email y Rss

email rss

Klout

Seguidores en facebook

Timeline de mi Twitter

Tienes preguntas?

Ideas de un Conejo
Más allá de los sistemas de información: (C#)=> videojuegos, soluciones a problemas interesantes y Sistemas Operativos
XNA
C#
Sistemas Operativos
Varios
Windows Phone
WinRT
XAML
Azure
HTML 5
Acerca de

C# – WPF – Escalar el tamaño de la fuente al cambiar el tamaño de la ventana o control

April 24th, 2011 by JuanK

Follow @JuanKRuiz

Cambiar el tamaño de la fuente a medida que el control cambia de tamaño es una tarea frecuente, pero esta pobremente documentada, en este articulo esta la respuesta.

Este es uno de esos temas…

Puedes pasar horas buscando diferentes alternativas alrededor de la web, encontraras cosas como

  • ViewBox
  • FontSizeConverter
  • IValueConverter
  • etc.

Nada de eso funciona al menos no como se espera, aunque según el caso pueden dar una buena aproximación a la solución.

He escrito este artículo para ayudar a muchos desarrolladores (y diseñadores) a resolver este problema de manera definitiva.

Cómo realizar el cálculo de tamaño de fuente?

Dado que las fuentes, en su mayoría, son más altas que anchas es importante entonces que usemos como referencia la propiedad Height del control contenedor para definir el tamaño de la fuente con respecto a su dimensión más grande.

El alto de la fuente esta dictado por la medición de tres partes básicas:

  1. Ascendente
  2. Descendente
  3. Inicial

Observando esta gráfica es fácil hacerse una mejor idea:

diagram

 

La clase FontFamily en WPF posee la propiedad LineSpacing, la cual es ni más ni menos que el alto total de la fuente de acuerdo a los parámetros anteriormente citados.

Sin embargo esto no es todo, la propiedad LineSpacing es un valor genérico para la FontFamily sin importar el tamaño actual de la fuente utilizada, es decir este atributo nos da una relación proporcional respecto al tamaño de la fuente en unidades em.

Por ende podemos decir que el alto de una fuente en unidades em es

Alto = tamaño fuente * FontFamily.LineSpacing

Eso es correcto, pero nosotros no necesitamos calcular el alto de la fuente, sino calcular el tamaño de la fuente con respecto al Height del contenedor ( Button, Window etc), en ese caso la formula a utilizar sería:

tamaño fuente = Alto / FontFamily.LineSpacing

Implementación

Creamos una ventana de WPF con el siguiente código

<Window x:Class="AutoScaleFont.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
    <Label HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
         SizeChanged="Control_SizeChanged">
        Test</Label>
    </DockPanel>
</Window>

En el archivo de código creamos el controlador para el evento SizeChanged

private void Control_SizeChanged(object sender, SizeChangedEventArgs e)
{
    Control tmp = sender as Control;
    tmp.FontSize = e.NewSize.Height / tmp.FontFamily.LineSpacing;
}  

El código se explica a si mismo, sin embargo haré una explicación breve. Establecemos la propiedad FontSize de acuerdo a la formula explicada más arriba tomamos el nuevo Alto del control y lo dividimos en la propiedad LineSpacing del FontFamily utilizado por el control.

Una optimización adicional es hacer que el alto de la fuente sea calculado con un valor levemente menor al del control contenedor para dejar un espacio de margen, con el ánimo de hacerlo proporcional le restamos solo un porcentaje respecto al alto total, en este caso el 5%, quedando así:

private void Control_SizeChanged(object sender, SizeChangedEventArgs e)
{
    Control tmp = sender as Control;
    tmp.FontSize = (e.NewSize.Height - e.NewSize.Height * .05d) / tmp.FontFamily.LineSpacing;
}  

Iniciemos la ejecución y revisemos el resultado:

 

Eso es justo lo que deseamos!

Si lo deseas puedes hacerlo respecto al ancho del control en lugar de respecto al alto, según sea tu necesidad, en ese caso debes ayudarte con la clase FormattedText y su propiedad Width para hallar el largo total en pixeles de la cadena.

Print Friendly

Follow @JuanKRuiz

  • 1 Comentario »
  • Publicado en la categoría 'C#'

Un comentario to “C# – WPF – Escalar el tamaño de la fuente al cambiar el tamaño de la ventana o control ”


  • Ideas de un Conejo Says:
    June 10th, 2011 at 12:40 pm  

    [...] C# – WPF – Escalar el tamaño de la fuente al cambiar el tamaño de la venta… [...]

Deja un comentario

Redes Sociales

Follow @JuanKRuiz
Answer Questions

Busca en el blog

Artículos Relacionados

  • C# – El extraño caso de la ventana sin borde que no se deja cambiar de tamaño
  • C# – usar el WndProc en una Ventana WPF
  • C# – Como obtener un manejador (handle) para una ventana de WPF
  • Como cambiar el texto de los botones de un MessageBox – C#
  • C# – Conseguir un Handler a la Ventana de un Proceso
  • El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar
  • C# – Cómo modificar la transparencia en la ventana de otro proceso?
  • Artículos Relacionados

  • C# – El extraño caso de la ventana sin borde que no se deja cambiar de tamaño
  • C# – usar el WndProc en una Ventana WPF
  • C# – Como obtener un manejador (handle) para una ventana de WPF
  • Como cambiar el texto de los botones de un MessageBox – C#
  • C# – Conseguir un Handler a la Ventana de un Proceso
  • El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar
  • C# – Cómo modificar la transparencia en la ventana de otro proceso?
  • Nube de Temas

    API - Azure - C# - codigo - Forms - IE - IE9 - Image - imagenes - IT - Microsoft - MVP - Pinned - PowerShell - Proceso - rendimiento - RSS - sistema - Sistemas Operativos - Site - Visual - WCF - Windows - Windows 8 - Windows Store - WinRT - WndProc - WPF - XAML - XNA

    Blogs recomendados

  • VBCodigoPocketPC Espacio para tratar temas de programacion para dispositivos moviles, Pocket PC, Compact Framework, Embbeded Visual Basic, Visual Basic.NET , C# (C Sharp)
  • Róbinson Moscoso Estaré publicando acá cosas sobre tecnologia .NET, situacioines cotidianas de las que voy aprendiendo… sirve como extensión de memoria.
  • .Net C# Blog de Nelsón Venegas
  • Warnov Microsoft Developer Evangelist
  • IT LIfe Blog de mi Hermano que esta en el lado claro: IT
  • Sorey Garcia Una chica del común con la firme intención de no serlo
  • Black Byte videojuegos, modelado y animación 3d
  • Road to IT World Cosas interesantes de IT
  • Marcela Chitiva Un poco de esto… un poco de aquello
  • Surviving the Nigth El mejor blog para aquellos que nos gustan los “internals”
  • Meta

    1. Log in
    2. WordPress

    Ideas de un Conejo is powered by Wordpress. Theme designed by Juan Carlos Ruiz.