quebra de linha para uma etiqueta no Windows Forms
Pergunta
Como podemos obter a funcionalidade de quebra de linha para uma etiqueta em Windows Forms ?
Eu coloquei um rótulo em um painel e acrescentou algum texto para rotular dinamicamente. Mas excede o comprimento do painel. Como posso resolver isso?
Solução
A resposta rápida: interruptor off AutoSize .
O grande problema aqui é que o rótulo não vai mudar a sua altura automaticamente (somente largura). Para obter este direito você precisará subclasse o rótulo e incluir lógica de redimensionamento vertical.
Basicamente o que você precisa fazer em OnPaint é:
- Medir a altura do texto (Graphics.MeasureString).
- Se a altura da etiqueta não é igual à altura do texto definir a altura e retorno.
- Desenhe o texto.
Você também precisará definir o ResizeRedraw bandeira do estilo no construtor.
Outras dicas
Na verdade, a resposta aceita é desnecessariamente complicado.
Se você definir o rótulo para AutoSize, ela vai crescer automaticamente com qualquer texto que você colocar nele. (Isto inclui o crescimento vertical.)
Se você quiser torná-lo quebra de linha em uma largura particular, você pode definir a propriedade MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
testado e funciona.
No meu caso (etiqueta em um painel) Eu definir label.AutoSize = false
e label.Dock = Fill
.
E o texto do rótulo é enrolado automaticamente.
Más notícias:. Não é uma propriedade Autowrap
Boa notícia: há uma luz no fim do túnel
Você pode fazer isso por meio de programação ao tamanho dinamicamente, mas aqui é a solução mais fácil:
- Selecione as propriedades da etiqueta ??li>
- AutoSize = True
-
MaximumSize = ( Largura , Altura ), onde Largura = tamanho máximo que você quer o rótulo de ser e Altura = quantos pixels você quer que embrulhe
A partir MSDN , automaticamente Moldar texto na etiqueta :
using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
public class GrowLabel : Label {
private bool mGrowing;
public GrowLabel() {
this.AutoSize = false;
}
private void resizeLabel() {
if (mGrowing)
return;
try {
mGrowing = true;
Size sz = new Size(this.Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
this.Height = sz.Height;
}
finally {
mGrowing = false;
}
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
resizeLabel();
}
protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged(e);
resizeLabel();
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
resizeLabel();
}
}
Eu tive que encontrar uma solução rápida, então eu só usei uma caixa de texto com essas propriedades:
var myLabel = new TextBox
{
Text = "xxx xxx xxx",
WordWrap = true,
AutoSize = false,
Enabled = false,
Size = new Size(60, 30),
BorderStyle = BorderStyle.None,
Multiline = true,
BackColor = container.BackColor
};
Tenha um melhor com base em @hypo 's resposta ??p>
public class GrowLabel : Label {
private bool mGrowing;
public GrowLabel() {
this.AutoSize = false;
}
private void resizeLabel() {
if (mGrowing)
return;
try {
mGrowing = true;
int width = this.Parent == null ? this.Width : this.Parent.Width;
Size sz = new Size(this.Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
this.Height = sz.Height + Padding.Bottom + Padding.Top;
} finally {
mGrowing = false;
}
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
resizeLabel();
}
protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged(e);
resizeLabel();
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
resizeLabel();
}
}
int width = this.Parent == null ? this.Width : this.Parent.Width;
isso permite que você use etiqueta auto-grow quando acoplado a um pai, por exemplo, um painel.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
aqui nós cuidamos de preenchimento para cima e em baixo.
- Coloque o rótulo dentro de um painel
-
Lidar com o
ClientSizeChanged event
para o painel, tornando o etiqueta preencher o espaço:private void Panel2_ClientSizeChanged(object sender, EventArgs e) { label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000); }
-
Set
Auto-Size
para o rótulo paratrue
- Set
Dock
para o rótulo paraFill
Não tenho certeza que vai caber todos os casos de uso, mas muitas vezes eu uso um truque simples para obter o comportamento de acondicionamento:
colocar o seu Label
com AutoSize=false
dentro de um TableLayoutPanel
1x1 que vai cuidar do tamanho do Label
.
Se o seu painel é limitar a largura da sua etiqueta, você pode definir Anchor propriedade do seu rótulo para esquerda, direita e conjunto de AutoSize como true. Esta é conceitualmente similar à escuta de evento SizeChanged
do Painel e atualizar MaximumSize do rótulo para um new Size(((Control)sender).Size.Width, 0)
como sugerido por uma anterior resposta . Cada lado listado na propriedade da âncora é, assim, ancoradas ao respectivo lado interior da contendo de controlo. Então, listando dois lados opostos em Anchor efetivamente define a dimensão do controle. Ancoragem para a esquerda e conjuntos direito de propriedade Largura do Controle e ancoragem Superior e Inferior iria definir sua propriedade Height.
Esta solução, como C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Se você realmente quer para definir o rótulo de largura independente do conteúdo, acho que a maneira mais fácil é esta:
- Set dimensionamento automático true
- Definir largura máxima de como você quer que ele
- Definir largura mínima idêntica
Agora, o rótulo é de largura constante, mas ele se adapta a sua altura automaticamente.
Depois de texto dinâmico, diminuir o tamanho da fonte. Se necessário, use esse trecho na sub onde o texto do rótulo é definido:
If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
Dim naam As String = Label12.Font.Name
Dim size As Single = Label12.Font.SizeInPoints - 1
Label12.Font = New Font(naam, size)
End If
Isso me ajudou no meu formulário chamado InpitWindow: Em Designer para Label:
AutoSize = true;
Achors = Top, Left, Right.
private void InputWindow_Shown(object sender, EventArgs e) {
lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
lbCaption.Margin.Right - lbCaption.Margin.Left,
Screen.GetWorkingArea(this).Height / 2);
this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
//Uncomment this line to prevent form height chage to values lower than initial height
//this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
}
//Use this handler if you want your label change it size according to form clientsize.
private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
Screen.GetWorkingArea(this).Height / 2);
}
Se as dimensões da necessidade botão para ser mantida inalterada:
myButton.Text = "word\r\nwrapped"
A resposta simples para esse problema é para alterar a propriedade Dock of the Label. É "NONE" por padrão.
Use style="overflow:Scroll"
no rótulo como no abaixo HTML. Isto irá adicionar a barra de rolagem na etiqueta dentro do painel.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>