12 Jan, 2010 14:06

Label multi-line em Windows Mobile: solução para algo que deveria ser simples

Para exemplificar o que digo, mostro a vocês um problema que tive em Windows Mobile, que na teoria deveria ser bem fácil resolver: uma label que pode receber conteúdo dinâmico (acontece toda hora) e que o seu container deve ser redimensionado de acordo com esse conteúdo; se ele tiver que ter duas linhas, que aumente o seu tamanho para comportar duas. Se tiver três, que aumente mais um pouco.

Isso deveria ser tranquilo, certo? Errado. Ao pesquisar sobre como fazer isso, até descobri que há como fazer em C#, utilizando o método Graphics.MeasureString; porém, como muitas funcionalidades que a gente acha fuçando no Google, essa é mais uma que não está disponível para o Compact Framework.

Com o desânimo já batendo à porta, achamos em um dos últimos links procurados um site na Argentina de um desenvolvedor que implementou uma classe para tratar disso em Windows Mobile. Como sempre, pegamos a implementação dele, incorporamos ao nosso código, e colocamos de maneira mais fácil de ser utilizada.

Primeiro, baixe esse arquivo, que contém a definição da classe que iremos utilizar. Ela contém o código que faz toda a mágica. Chamo a atenção para o seguinte método:

internal static int GetLabelSize(Label label, Graphics graphics) {
    return CFMeasureString.MeasureString(graphics, label.Text, label.ClientRectangle, false).Height;
}

Com ele, basta você passar a label que você deseja saber a altura (height), usando o seguinte código:

minhaLabel.Height = CFMeasureString.GetLabelSize(minhaLabel, CreateGraphics());

O método CreateGraphics() é interno a um Form, de forma que a utilização da linha acima deve ser feita preferencialmente no formulário. Convém dizer que o GetLabelSize não funciona com todas as implementações de Label, como, por exemplo, o transparent label. Mas já quebra o maior galho :P.

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.