Resultados para ''
Label multi-line em Windows Mobile: solução para algo que deveria ser simples
Escrito por Afonso Junior em 12/01/10 14:06
Quem já programou para iPhone conhece as facilidades que o Interface Builder fornece para fazer as suas telas. Para quem tem a árdua missão de elaborar as mesmas interfaces para Windows Mobile, não vai encontrar todas essas facilidades, o que pode prejudicar e muito o desenvolvimento e, consequentemente, a experiência do usuário.
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.
Leia também:
Label transparente em Windows Mobile
Escrito por Raphael Oliveira em 30/07/09 12:26
Uma das dificuldades encontradas por quase todos que se aventuram a programar em Windows Mobile é: Como fazer Label com fundo transparente? E porque a propriedade transparent parece não funcionar?
Começando pela segunda pergunta, a resposta é que a propriedade transparent faz com que Label herde a cor de seu pai, o que funciona somente quando temos Label colocada sobre um fundo de uma única cor. Ou seja, essa propriedade de nada adianta se temos uma imagem de fundo. Então como solução (e também respondendo a primeira pergunta), siga os passos abaixo.
Primeiro, crie em seu projeto uma Component Class (neste exemplo criamos uma nova pasta chamada de Util -> Add -> New Item -> Component Class).
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing;
namespace TransparenteLabelExample.Util {
public partial class TransparentLabel : Control {
public TransparentLabel() {
this.TextChanged += new System.EventHandler(this.alterouTexto);
}
public void alterouTexto(object sender, EventArgs e) {
this.Invalidate();
}
protected override void OnPaintBackground(PaintEventArgs e) {
}
private bool bPaintOnce = false;
protected override void OnPaint(PaintEventArgs e) {
if (!bPaintOnce) {
bPaintOnce = true;
this.Visible = false;
this.Parent.Invalidate(this.Bounds);
this.Parent.Update();
this.Visible = true;
return;
}
else {
bPaintOnce = false;
Graphics g = e.Graphics;
Font font = this.Font;
SolidBrush brush = new SolidBrush(this.ForeColor);
g.DrawString(this.Text, font, brush, 1, 1);
g.Dispose();
}
}
}
}
Depois, execute seu programa uma vez, a Toolbox do Visual Studio conterá um novo Componente que é a TransparentLabel!
Aqui uma imagem para ilustrar:

Também é possível utilizar esta mesma técnica para criar imagens com fundo transparente com esta Classe.